home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Information / CSMP Digest / volume 3 / csmp-digest-v3-140 < prev    next >
Text File  |  1996-03-23  |  84KB  |  2,091 lines

  1. C.S.M.P. Digest             Mon, 11 Mar 96       Volume 3 : Issue 140
  2.  
  3. Today's Topics:
  4.  
  5.         "Apple's 3-D interface guidelines" ??
  6.         'sysz' resources
  7.         (Q) How to find local hard disk volumes only
  8.         AppleEvents to-from an extension?
  9.         Control panel code?
  10.         DDP Listener Broadcast Problem
  11.         Is C++ OK?  Make yourself heard!
  12.         Removing a Gestalt entry - possible?
  13.  
  14.  
  15.  
  16. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  17. (pottier@clipper.ens.fr).
  18.  
  19. The digest is a collection of article threads from the internet
  20. newsgroups comp.sys.mac.programmer.help, csmp.tools, csmp.misc and
  21. csmp.games. It is designed for people who read news semi-regularly and
  22. want an archive of the discussions.  If you don't know what a
  23. newsgroup is, you probably don't have access to it. Ask your systems
  24. administrator(s) for details. If you don't have access to news, you
  25. may still be able to post messages to the group by using a mail server
  26. like anon.penet.fi (mail help@anon.penet.fi for more information).
  27.  
  28. Each issue of the digest contains one or more sets of articles (called
  29. threads), with each set corresponding to a 'discussion' of a particular
  30. subject.  The articles are not edited; all articles included in this digest
  31. are in their original posted form (as received by our news server at
  32. nef.ens.fr).  Article threads are not added to the digest until the last
  33. article added to the thread is at least two weeks old (this is to ensure that
  34. the thread is dead before adding it to the digest).  Article threads that
  35. consist of only one message are generally not included in the digest.
  36.  
  37. The digest is officially distributed by two means, by email and ftp.
  38.  
  39. If you want to receive the digest by mail, send email to listserv@ens.fr
  40. with no subject and one of the following commands as body:
  41.     help                        Sends you a summary of commands
  42.     subscribe csmp-digest Your Name    Adds you to the mailing list
  43.     signoff csmp-digest            Removes you from the list
  44. Once you have subscribed, you will automatically receive each new
  45. issue as it is created.
  46.  
  47. The official ftp info is ftp://ftp.dartmouth.edu/pub/csmp-digest.
  48. Questions related to the ftp site should be directed to
  49. scott.silver@dartmouth.edu.
  50.  
  51. -------------------------------------------------------
  52.  
  53. >From Rich <4thought@world.std.com>
  54. Subject: "Apple's 3-D interface guidelines" ??
  55. Date: Mon, 19 Feb 1996 00:47:38 GMT
  56. Organization: The World @ Software Tool & Die
  57.  
  58. I recently read a review of a 3D modeling product where the
  59. reviewer recommended that the product's company "take to
  60. heart Apple's 3-D interface guidelines"...
  61.  
  62. Does anyone know what particular document the reviewer was
  63. talking about, and how I can get my hands on it if it exists?
  64.  
  65. Thanks,
  66. Rich Wagner
  67.  
  68.  
  69. P.S.  No, I don't work for that product's company.
  70.  
  71. +++++++++++++++++++++++++++
  72.  
  73. >From matthewm@cts.com (matthew malevloent)
  74. Date: Sun, 18 Feb 1996 20:27:23 -0800
  75. Organization: CTS Network Services
  76.  
  77. In article <3127C8AA.25E8@world.std.com>, Rich <4thought@world.std.com> wrote:
  78.  
  79. > I recently read a review of a 3D modeling product where the
  80. > reviewer recommended that the product's company "take to
  81. > heart Apple's 3-D interface guidelines"...
  82. > Does anyone know what particular document the reviewer was
  83. > talking about, and how I can get my hands on it if it exists?
  84. > Thanks,
  85. > Rich Wagner
  86. > P.S.  No, I don't work for that product's company.
  87.  
  88. I would try the Apple Programmers Developers Association,
  89. apda@appleline.com [I think].
  90.  
  91. Matthew Malevolent
  92.  
  93. +++++++++++++++++++++++++++
  94.  
  95. >From gurgle@apple.com (Pete Gontier)
  96. Date: Mon, 19 Feb 1996 13:00:32 -0800
  97. Organization: Apple Computer, Inc.
  98.  
  99. In article <3127C8AA.25E8@world.std.com>,
  100. Rich <4thought@world.std.com> wrote:
  101.  
  102.  > I recently read a review of a 3D modeling product where the
  103.  > reviewer recommended that the product's company "take to
  104.  > heart Apple's 3-D interface guidelines"...
  105.  > 
  106.  > Does anyone know what particular document the reviewer was
  107.  > talking about, and how I can get my hands on it if it exists?
  108.  
  109. In general...
  110.  
  111.    <http://dev.info.apple.com/insidemac/quickdraw3d>
  112.  
  113. ...and in particular...
  114.  
  115.    <http://dev.info.apple.com/insidemac/quickdraw3d/Intro-2.html#HEADING2-17>
  116.  
  117. - -
  118.  
  119.   Pete Gontier, Integer Poet, Apple Macintosh Developer Technical Support
  120.  
  121.   work      mail  <mailto:gurgle@apple.com>
  122.   personal  mail  <mailto:gurgle@ccnet.com>
  123.   personal  web   <http://www.ccnet.com/~gurgle>
  124.   work      web   <http://dev.info.apple.com/dts.html>
  125.  
  126. +++++++++++++++++++++++++++
  127.  
  128. >From S Purcell <spurcell@shore.intercom.net>
  129. Date: 20 Feb 1996 01:23:22 GMT
  130. Organization: Soliton Software
  131.  
  132. In article <3127C8AA.25E8@world.std.com>, Rich <4thought@world.std.com> wrote:
  133.  
  134. > I recently read a review of a 3D modeling product where the
  135. > reviewer recommended that the product's company "take to
  136. > heart Apple's 3-D interface guidelines"...
  137. > Does anyone know what particular document the reviewer was
  138. > talking about, and how I can get my hands on it if it exists?
  139.  
  140. I believe they're referring to the article "Working in the 3rd Dimension"
  141. in issue 15 of develop. You can get it at
  142.  
  143. "http://www.info.apple.com/cgi-bin/lister-pl?Apple.Support.Area/Developer_Servi
  144. ces/Periodicals/develop/develop15/develop_Issue_15_"
  145.  
  146. it's in the Adobe portable document format. If you don't have the reader, you
  147. can get it at
  148.  
  149. "http://www.adobe.com/Software/Acrobat/mac.html"
  150.  
  151. Seth Purcell, Mac C++ Programmer for Soliton Software
  152.  
  153.  
  154.  
  155. +++++++++++++++++++++++++++
  156.  
  157. >From ur@muc.de (Uli Rueckert)
  158. Date: 21 Feb 1996 20:48:48 GMT
  159. Organization: private
  160.  
  161. Hi!
  162.  
  163. In article <3127C8AA.25E8@world.std.com>, Rich <4thought@world.std.com> wrote:
  164. > I recently read a review of a 3D modeling product where the
  165. > reviewer recommended that the product's company "take to
  166. > heart Apple's 3-D interface guidelines"...
  167. > Does anyone know what particular document the reviewer was
  168. > talking about, and how I can get my hands on it if it exists?
  169. A preliminary version of the "QD 3D UI Guidelines" is on the cd, which is
  170. contained in Apple's official QD3D documentation "3D Graphics Programming
  171. With QD3D".
  172. Maybe you'll find the guidelines on the QD3D SDK, which is available at
  173. <ftp://ftp.info.apple.com/Apple.Support.Area/QuickDraw3D/>.
  174.  
  175. cu,
  176.     U. Rueckert
  177.  
  178. +++++++++++++++++++++++++++
  179.  
  180. >From Rich <4thought@world.std.com>
  181. Date: Sat, 24 Feb 1996 18:21:49 GMT
  182. Organization: The World @ Software Tool & Die
  183.  
  184. Uli Rueckert wrote:
  185. > Hi!
  186. > A preliminary version of the "QD 3D UI Guidelines" is on the cd, which is
  187. > contained in Apple's official QD3D documentation "3D Graphics Programming
  188. > With QD3D".
  189. > Maybe you'll find the guidelines on the QD3D SDK, which is available at
  190. > <ftp://ftp.info.apple.com/Apple.Support.Area/QuickDraw3D/>.
  191. > cu,
  192. >     U. Rueckert
  193.  
  194.  
  195. I just wanted to thank all those who responded.  It turns out that
  196. Uli Rueckert's response gave me what I was looking for: I actually
  197. already had the QD-3D CD-ROM, but I hadn't found the article until
  198. it was pointed out to me.  (Those CDs sure to pack a lot...)
  199.  
  200. The other responses were also useful, though.  For example, though the
  201. "Working in the Third Dimension" article wasn't what I was initially
  202. looking for, I'm glad to have gotten that (it was Email-ed to me!  Talk
  203. about service  :-)
  204.  
  205. Thanks very much,
  206. Rich Wagner
  207.  
  208.  
  209.  
  210.                It's no big thing, It's a small thing:
  211.                          What people think
  212.  
  213.                                -- Byrne & Eno
  214.  
  215. ---------------------------
  216.  
  217. >From John Moe <jmoe@wshs.luminet.net>
  218. Subject: 'sysz' resources
  219. Date: Thu, 22 Feb 1996 08:29:41 -0600
  220. Organization: Sundstrand Aerospace
  221.  
  222. what is the 'sysz' resource?  I found it in several INIT's.
  223. Is this related to disabling the shift key no extensions thing?
  224. --John
  225.  
  226. +++++++++++++++++++++++++++
  227.  
  228. >From david_rehring@gdt.com (David Rehring)
  229. Date: Thu, 22 Feb 1996 15:29:11 -0700
  230. Organization: GDT Softworks, Inc.
  231.  
  232. In article <312C7DD5.452E@wshs.luminet.net>, John Moe
  233. <jmoe@wshs.luminet.net> wrote:
  234.  
  235. > what is the 'sysz' resource?  I found it in several INIT's.
  236. > Is this related to disabling the shift key no extensions thing?
  237. > --John
  238.  
  239. John,
  240.  
  241. No.  It is used by the system to expand the system heap by whatever amount
  242. is in the first 4 bytes of the 'sysz' resource.  For example, if your INIT
  243. loads a 10K code resource and allocates a 50K buffer in the System Heap
  244. (via NewPtrSys or something like it), then you would set the 'sysz'
  245. resource to something like 65000 (in hex).
  246.  
  247. -- 
  248. David Rehring
  249. Software Engineer
  250. GDT Softworks, Inc.
  251. And all around wacky guy!
  252.  
  253. +++++++++++++++++++++++++++
  254.  
  255. >From Patrick.Stadelmann@etudiants.unine.ch (Patrick Stadelmann)
  256. Date: Fri, 23 Feb 1996 10:16:40 +0100
  257. Organization: University of Neuchatel
  258.  
  259. In article <312C7DD5.452E@wshs.luminet.net>, John Moe
  260. <jmoe@wshs.luminet.net> wrote:
  261.  
  262. > what is the 'sysz' resource?  I found it in several INIT's.
  263. > Is this related to disabling the shift key no extensions thing?
  264.  
  265. No. 'sysz' is for "system zone". This resource specify the amount
  266. of system heap (memory) that the INIT needs.
  267.  
  268. Patrick
  269.  
  270. -- 
  271. Patrick Stadelmann <Patrick.Stadelmann@etudiants.unine.ch>
  272.  
  273. ---------------------------
  274.  
  275. >From kvictor@best.com (Ken Victor)
  276. Subject: (Q) How to find local hard disk volumes only
  277. Date: Tue, 20 Feb 1996 15:29:05 -0800
  278. Organization: Victor Consultin
  279.  
  280. using PBHGetVInfoSync i am able to find all mounted disks and i can
  281. eliminate cd-roms (as being hardware protected - bit 7 of ioVAtrb),
  282. foreign volumes (non zero ioVFSID), and ejected/dismounted volumes
  283. (ioVDrvInfo <= 0).
  284.  
  285. i would also like to eliminate all floppies and ram disks. is there an
  286. accepted way to do this?  i could eliminate floppies based on size less
  287. than 1.5MB, but is this the best way?  i'm not sure how to eliminate ram
  288. disks (although at least with apple's system 7.5.2 ram disk, bit 10 of
  289. ioVAtrb seems to be set...)
  290.  
  291. thanx,
  292. ken victor
  293.  
  294. ps. if possible, please respond via email:
  295. KVictor@Best.Com
  296.  
  297. +++++++++++++++++++++++++++
  298.  
  299. >From mclow@mailhost2.csusm.edu (Marshall Clow)
  300. Date: Tue, 20 Feb 1996 21:48:40 -0800
  301. Organization: Aladdin Systems
  302.  
  303. In article <kvictor-2002961529050001@kvictor.vip.best.com>,
  304. kvictor@best.com (Ken Victor) wrote:
  305.  
  306. >using PBHGetVInfoSync i am able to find all mounted disks and i can
  307. >eliminate cd-roms (as being hardware protected - bit 7 of ioVAtrb),
  308. >foreign volumes (non zero ioVFSID), and ejected/dismounted volumes
  309. >(ioVDrvInfo <= 0).
  310. >
  311. >i would also like to eliminate all floppies and ram disks. is there an
  312. >accepted way to do this?  i could eliminate floppies based on size less
  313. >than 1.5MB, but is this the best way?  i'm not sure how to eliminate ram
  314. >disks (although at least with apple's system 7.5.2 ram disk, bit 10 of
  315. >ioVAtrb seems to be set...)
  316. >
  317. What do you want to do about Zip drives?
  318. All Apple floppy drives use the ".Sony" driver. 
  319.    So does the HD 20, if you care :-)
  320.  
  321. You could check the driver reference number to see if it's a SCSI device...
  322.  
  323. What, exactly are you trying to accomplish?
  324.  
  325. -- 
  326. Marshall Clow
  327. Aladdin Systems
  328.  
  329. "They that can give up essential liberty to obtain a little temporary
  330.  safety deserve neither liberty nor safety." -- Benjamin Franklin
  331.  _Historical Review of Pennsylvania_, 1759
  332.  
  333. +++++++++++++++++++++++++++
  334.  
  335. >From kvictor@best.com (Ken Victor)
  336. Date: Wed, 21 Feb 1996 08:53:33 -0800
  337. Organization: Victor Consultin
  338.  
  339. In article <mclow-2002962148400001@burns.idio.com>,
  340. mclow@mailhost2.csusm.edu (Marshall Clow) wrote:
  341.  
  342. >In article <kvictor-2002961529050001@kvictor.vip.best.com>,
  343. >kvictor@best.com (Ken Victor) wrote:
  344. >
  345. >>using PBHGetVInfoSync i am able to find all mounted disks and i can
  346. >>eliminate cd-roms (as being hardware protected - bit 7 of ioVAtrb),
  347. >>foreign volumes (non zero ioVFSID), and ejected/dismounted volumes
  348. >>(ioVDrvInfo <= 0).
  349. >>
  350. >>i would also like to eliminate all floppies and ram disks. is there an
  351. >>accepted way to do this?  i could eliminate floppies based on size less
  352. >>than 1.5MB, but is this the best way?  i'm not sure how to eliminate ram
  353. >>disks (although at least with apple's system 7.5.2 ram disk, bit 10 of
  354. >>ioVAtrb seems to be set...)
  355. >>
  356. >What do you want to do about Zip drives?
  357. >All Apple floppy drives use the ".Sony" driver. 
  358. >   So does the HD 20, if you care :-)
  359. >
  360. >You could check the driver reference number to see if it's a SCSI device...
  361. >
  362. >What, exactly are you trying to accomplish?
  363.  
  364. thanx for the reply.  i'm looking for all files of certain types on local
  365. hard disks  (sorry i can't say anymore at this time).
  366.  
  367. ken
  368.  
  369. +++++++++++++++++++++++++++
  370.  
  371. >From Jeff Pritchard <jeffp@inow.com>
  372. Date: Wed, 21 Feb 1996 18:50:32 -0700
  373. Organization: NSI/INOW
  374.  
  375. Try this:
  376.  
  377. Boolean VolumeIsRamDisk(short vrefnum)
  378.     {
  379.     short drivenum = GetDriveNum(vrefnum);
  380.     
  381.     QHdrPtr driveQH = GetDrvQHdr();
  382.     DrvQElPtr driveQ = DrvQElPtr(driveQH->qHead);
  383.     DCtlHandle theDCE;
  384.     
  385.     while(driveQ)
  386.         {
  387.         if(driveQ->dQDrive == drivenum)
  388.             {
  389.             short refNum = driveQ->dQRefNum;
  390.             theDCE = GetDCtlEntry(refNum);
  391.             Ptr    theDriver = (*theDCE)->dCtlDriver;
  392.             unsigned char *theName = (unsigned char *)((struct DRVRHeader 
  393. *)theDriver)->drvrName;
  394.             if(EqualString(theName,"\p.EDisk",false,false))
  395.                 return true;
  396.             else
  397.                 return false;
  398.             }
  399.         driveQ = DrvQElPtr(driveQ->qLink);
  400.         }
  401.     return false;
  402.     }
  403.  
  404. short GetDriveNum(short vRefNum)
  405.     {
  406.     OSErr error;
  407.     HParamBlockRec pb;
  408.     unsigned char name[32];
  409.     name[0] = 0;
  410.     
  411.     pb.volumeParam.ioCompletion = nil;
  412.     pb.volumeParam.ioVolIndex = 0;
  413.     pb.volumeParam.ioNamePtr = name;
  414.     pb.volumeParam.ioVRefNum = vRefNum;
  415.     error = PBHGetVInfoSync(&pb);
  416.     if(error) return 0;
  417.     
  418.     return pb.volumeParam.ioVDrvInfo;        // stupid name for a drive number!
  419.     }
  420.  
  421.  
  422. BTW: I use the size to detect floppies.  If anybody creates a 1.5M 
  423. volume on a hard disk, they deserve what they get. 8^)
  424.  
  425. -- 
  426. ++++++++++++++++++++++++++++++++++++++++++++++++++++
  427. +
  428. + Jeff Pritchard
  429. + Fremont, CA USA  (SF Bay Area)
  430. +
  431. +       Excessive moderation may lead to insufficiency.
  432. +
  433. ++++++++++++++++++++++++++++++++++++++++++++++++++++
  434.  
  435. +++++++++++++++++++++++++++
  436.  
  437. >From gurgle@apple.com (Pete Gontier)
  438. Date: Fri, 23 Feb 1996 12:07:44 -0800
  439. Organization: Apple Computer, Inc.
  440.  
  441. In article <kvictor-2002961529050001@kvictor.vip.best.com>,
  442. kvictor@best.com (Ken Victor) wrote:
  443.  
  444.  > i would ... like to eliminate all floppies and ram disks. is there an
  445.  > accepted way to do this?
  446.  
  447. Not really. There are bazillions of third-party disk drivers out there,
  448. and just about all of them have some unique property which invalidates any
  449. one test. The best you can do is describe as many things about the volumes
  450. you want to eliminate and write a test for each of those things.
  451.  
  452.  > i could eliminate floppies based on size less
  453.  > than 1.5MB, but is this the best way?
  454.  
  455. This is basically what Finder does. Horrifying, eh?
  456.  
  457. - -
  458.  
  459.   Pete Gontier, Integer Poet, Apple Macintosh Developer Technical Support
  460.  
  461.   work      mail  <mailto:gurgle@apple.com>
  462.   personal  mail  <mailto:gurgle@ccnet.com>
  463.   personal  web   <http://www.ccnet.com/~gurgle>
  464.   work      web   <http://dev.info.apple.com/dts.html>
  465.  
  466. +++++++++++++++++++++++++++
  467.  
  468. >From gurgle@apple.com (Pete Gontier)
  469. Date: Fri, 23 Feb 1996 12:08:55 -0800
  470. Organization: Apple Computer, Inc.
  471.  
  472. In article <312BCBE8.56C7@inow.com>, jeffp@inow.com wrote:
  473.  
  474.  > if(EqualString(theName,"\p.EDisk",false,false))
  475.  
  476. This will find Apple's RAM disk driver, but there are lots of other RAM
  477. disks out there.
  478.  
  479. - -
  480.  
  481.   Pete Gontier, Integer Poet, Apple Macintosh Developer Technical Support
  482.  
  483.   work      mail  <mailto:gurgle@apple.com>
  484.   personal  mail  <mailto:gurgle@ccnet.com>
  485.   personal  web   <http://www.ccnet.com/~gurgle>
  486.   work      web   <http://dev.info.apple.com/dts.html>
  487.  
  488. ---------------------------
  489.  
  490. >From agrignon@blue.weeg.uiowa.edu (A. Grignon)
  491. Subject: AppleEvents to-from an extension?
  492. Date: 23 Feb 96 02:18:09 GMT
  493. Organization: University of Iowa, Iowa City, IA, USA
  494.  
  495.  
  496. I'd like to be able to send/receive apple events from an extension.
  497. Sending them has proven to be no problem, but how might one 
  498. receive an AppleEvent, without having any sort of event loop?  If
  499. I register a handler for a particular type of event, will it just
  500. eventually get called when nobody else will accept the event regardless?
  501.  
  502. I can see a way to hack it work, by writing a jgne filter and peeking
  503. at everything, but this doesn't seem to be a very elegant solution.
  504. Surely this has been addressed by someone already?
  505.  
  506. Thanks for your help,
  507. -Andy
  508.  
  509.  
  510.  
  511. +++++++++++++++++++++++++++
  512.  
  513. >From jonpugh@netcom.com (Jon Pugh)
  514. Date: Sun, 25 Feb 1996 07:43:31 GMT
  515. Organization: Apple Computer
  516.  
  517. In article <agrignon.825041889@blue.weeg.uiowa.edu>,
  518. agrignon@blue.weeg.uiowa.edu (A. Grignon) wrote:
  519.  
  520. >I'd like to be able to send/receive apple events from an extension.
  521. >Sending them has proven to be no problem, but how might one 
  522. >receive an AppleEvent, without having any sort of event loop?  If
  523. >I register a handler for a particular type of event, will it just
  524. >eventually get called when nobody else will accept the event regardless?
  525. >
  526. >I can see a way to hack it work, by writing a jgne filter and peeking
  527. >at everything, but this doesn't seem to be a very elegant solution.
  528. >Surely this has been addressed by someone already?
  529.  
  530. CK Haun wrote a sample which should be in the snippets on the Apple web server.
  531.  
  532. http://dev.info.apple.com/source/index.html
  533.  
  534. It implements a cdev which sends AE.  I don't recall if it receives them,
  535. but I think it does.  Knowing CK, he would do a decent job of it.
  536.  
  537. The simple solution is to write an application instead of a cdev.  The
  538. Desktop Patterns cdev is really an app.  It's also scriptable.  It makes
  539. the whoe thing simple.
  540.  
  541. Jon
  542.  
  543. -- 
  544. What are YOU doing to oppose the Microsoft juggernaut?
  545.          http://www.infoworkshop.com/~jonpugh/
  546.  
  547. ---------------------------
  548.  
  549. >From blevitt@camis.stanford.edu (Ben Levitt)
  550. Subject: Control panel code?
  551. Date: Thu, 22 Feb 1996 16:23:49 -0800
  552. Organization: Stanford University
  553.  
  554. Could someone send me, or point me towards the C/C++ source of some simple
  555. control panels.  I would really find some examples handy, since I'm trying
  556. to learn how to create one myself.  
  557.  
  558.  Thanks!
  559.  
  560.  - Ben
  561. blevitt@CAMIS.Stanford.edu
  562.  
  563. +++++++++++++++++++++++++++
  564.  
  565. >From chewey@EnTechnology.com (Matthew E. Axsom)
  566. Date: Fri, 23 Feb 1996 15:33:19 GMT
  567. Organization: En Technology Corp.
  568.  
  569. In article <blevitt-2202961623490001@tip-mp7-ncs-14.stanford.edu>,
  570. blevitt@camis.stanford.edu (Ben Levitt) wrote:
  571.  
  572. >Could someone send me, or point me towards the C/C++ source of some simple
  573. >control panels.  I would really find some examples handy, since I'm trying
  574. >to learn how to create one myself.  
  575. >
  576. > Thanks!
  577. >
  578. > - Ben
  579. >blevitt@CAMIS.Stanford.edu
  580.  
  581. Try this url...
  582.  
  583. <ftp://mirror.apple.com//mirrors/Info-Mac.Archive/dev/src/
  584.   cw-cdev-framework-111-cpp.hqx>
  585.  
  586. -Chewey
  587. Matthew E. Axsom                                        En Technology Corp.
  588. chewey@EnTechnology.com                     Macintosh Software Craftsperson
  589. +--------------------------------------------------------------------------+
  590. ->>(Speaking for myself and *not* En Technology, I submit the following)<<-
  591. "When you are in it up to your ears, keep your mouth shut."
  592.  
  593. ---------------------------
  594.  
  595. >From Jeff Walker <jwalker@chattanooga.net>
  596. Subject: DDP Listener Broadcast Problem
  597. Date: 21 Feb 1996 00:38:00 GMT
  598. Organization: Ultimate Technographics Inc
  599.  
  600.  
  601. I am experiencing a problem with the Multi-Node feature of AppleTalk:
  602.  
  603.         When my listener receives any BROADCAST packet from a process
  604. running on the same machine, the packet length value is bogus.
  605.  
  606.    Upon entry to my listener code:
  607.  
  608.         ( The low word of D1 is supposed to be the length to read )
  609.         The D1 register is 0x000D0000 ( the low word being the length )
  610.  
  611.         The D1 register is supposed to be 0x0000XXXX ( xxxx being short
  612.                 length )
  613.  
  614.  
  615.         The socket listener for a MultiNode is ( to my knowledge )
  616. exactly like a standard DDP Listener, except that it is always passed an
  617. extended header and receives Broadcasts. 
  618.  
  619.         The listener works correctly for broadcasts from other machines
  620. and targeted packets from the same machine.
  621.  
  622.     I've read everyhing that I can get my hands on :
  623.     Tech notes
  624.     Inside mac networking
  625.     inside appletalk
  626.     and a copius amount of experimentation.
  627.  
  628. Everything is by the book. Somebody please help!
  629.  
  630. Sometimes I hate the macintosh
  631. Jeff
  632.  
  633. +++++++++++++++++++++++++++
  634.  
  635. >From hueras@tiac.net (Jon Hueras)
  636. Date: Mon, 26 Feb 1996 09:12:56 -0500
  637. Organization: The Internet Access Company
  638.  
  639. In article <4gdph8$h3h@news.chattanooga.net>, Jeff Walker
  640. <jwalker@chattanooga.net> wrote:
  641.  
  642. > I am experiencing a problem with the Multi-Node feature of AppleTalk:
  643. >         When my listener receives any BROADCAST packet from a process
  644. > running on the same machine, the packet length value is bogus.
  645. >    Upon entry to my listener code:
  646. >         ( The low word of D1 is supposed to be the length to read )
  647. >         The D1 register is 0x000D0000 ( the low word being the length )
  648. >         The D1 register is supposed to be 0x0000XXXX ( xxxx being short
  649. >                                 length )
  650. >         The socket listener for a MultiNode is ( to my knowledge )
  651. > exactly like a standard DDP Listener, except that it is always passed an
  652. > extended header and receives Broadcasts. 
  653. >         The listener works correctly for broadcasts from other machines
  654. > and targeted packets from the same machine.
  655. >         I've read everyhing that I can get my hands on :
  656. >         Tech notes
  657. >         Inside mac networking
  658. >         inside appletalk
  659. >         and a copius amount of experimentation.
  660. > Everything is by the book. Somebody please help!
  661. > Sometimes I hate the macintosh
  662. > Jeff
  663.  
  664. I reported this bug to Apple almost 4 years ago. Can it really still be
  665. unfixed? Do you happen to know what version of AppleTalk this is happening
  666. on for you?
  667.  
  668. In any case, here's a copy of my original bug report, complete with the
  669. code I came up with to work around the bug:
  670.  
  671.    While working on an application that makes use of AppleTalk v57's "multiple
  672.    node architecture" I encountered what is, I believe, a bug.
  673.    
  674.    Whenever a packet is broadcast from the local machine, whether via a
  675.    NetWrite call or via a writeDDP call from the "user node", the multinode
  676.    receiver routine gets called with an incorrect value in D1 (always zero, I
  677.    think). If a broadcast packet comes in from an external network, D1 always
  678.    contains the number of bytes remaining to be received from packet, as
  679.    expected.
  680.    
  681.    My workaround involves reconstructing the correct value for D1 using the
  682.    packet length in the RHA and the count of the number of bytes already in
  683.    the RHA derived from A3:
  684.    
  685.            move.l  a3, d2                             ;how many bytes in RHA?
  686.            sub.l   a2, d2
  687.            subq.l  #toRHA, d2
  688.            cmp.l   #lapHdSz+ddpLength+2, d2           ;big enough?
  689.            blo.s   FlushPkt                           ;no -->
  690.            cmp.l   #lapHdSz+ddphSzLong+ddpMaxData, d2 ;too big?
  691.            bhi.s   FlushPkt                           ;yes -->
  692.            move.w  toRHA+lapHdSz+ddpLength(a2), d0    ;does d1 agree with
  693.            and.w   #ddpLenMask, d0                    ;packet length?
  694.            subq.w  #2, d0                             ;(Apple bug filter)
  695.            cmp.w   d0, d1
  696.            beq.s   LengthOK                           ;yes -->
  697.            cmp.b   #$FF, toRHA+lapDstAdr(a2)          ;broadcast pkt?
  698.            bne.s   FlushPkt                           ;no --> inexcusable error!
  699.            move.w  d0, d1                             ;yes, fix up byte count
  700.  
  701. I did get an acknowedgement of this bug report from DTS as follows:
  702.  
  703.    ...just received word from AppleTalk engineering that the scenario which
  704.    you've reported is a "likely" problem, one which they will investigate
  705.    fixing in the next revision of AppleTalk.  The engineer commented that
  706.    your solution is the "right" thing to do in the meantime.
  707.  
  708. Perhaps the bug was fixed and any attempt to document it swept under the
  709. rug. If the bug persists in recent AppleTalk versions, though, that's
  710. scary.
  711.  
  712.    Jon
  713.  
  714. +++++++++++++++++++++++++++
  715.  
  716. >From hueras@tiac.net (Jon Hueras)
  717. Date: Mon, 26 Feb 1996 09:51:51 -0500
  718. Organization: The Internet Access Company
  719.  
  720. After I sent the preceding followup, I scanned a directory of all my
  721. Developer's CD for the work Multinode and discovered a *new* addition to
  722. Inside Mac (first appreared on the 9/95 CD) - Networking: Multinode
  723. Architecture. Within, I discovered the following paragraphs:
  724.  
  725.   A multinode receive routine is similar in concept to a socket listener that
  726.   receives packets addressed to a specific socket. The chapter “Datagram
  727.   Delivery Protocol (DDP)” in this book includes a sample socket listener. To
  728.   create a receive routine, perform the following steps:
  729.   
  730.     1. [...]
  731.     
  732.     2. Determine the number of bytes that have already been read into the .MPP
  733.        driver’s internal buffer, called the RHA.
  734.        
  735.        To do this, subtract the beginning address of the read-header area (RHA)
  736.        from the value in register A3, which points past the last byte read into
  737.        the RHA. To locate the offset at the beginning of the RHA, you can use
  738.        the toRHA equate.
  739.  
  740. Although this doesn't explicitly warn you *not* to trust D1, if you follow
  741. their instructions you'll be doing what my workaround does.
  742.  
  743. Checking back, I see that the Tech Note "NW 13 - AppleTalk: The Rest of
  744. the Story" says basically the same thing, so I guess there was a doc "fix"
  745. after all. Don't know why they couldn't fix AppleTalk itself; they must
  746. have desperately needed D1 for something else... :-)
  747.  
  748.    Jon
  749.  
  750. ---------------------------
  751.  
  752. >From chrisman@ucdmath.ucdavis.edu (Mark Chrisman)
  753. Subject: Is C++ OK?  Make yourself heard!
  754. Date: 14 Feb 1996 12:00:54 GMT
  755. Organization: Dept. of Computer & Information Science, NCTU, Taiwan
  756.  
  757. For my game, I'm working on some modules that I intend to be re-usable
  758. tools for other game programmers (that's you!).  
  759.  
  760. I'm planning an object-oriented approach, using C++.  My question is
  761. this:  How many of you would not consider using a tool if it's in C++? 
  762. (To use the tools, you would need to know C++, because you would have to
  763. define some subclasses.)
  764.  
  765. Objections based on the computational overhead of OOP don't count.  Speed
  766. is not an issue here, because the code is for things (e.g. preference
  767. files) which won't be part of a real-time game loop.
  768.  
  769. -Mark
  770.  
  771. +++++++++++++++++++++++++++
  772.  
  773. >From jregier@qualcomm.com (Jason Regier)
  774. Date: Wed, 14 Feb 1996 09:43:24 -0800
  775. Organization: Qualcomm, Inc.
  776.  
  777. In article <chrisman-1402960404220001@ppp059.inreach.com>,
  778. chrisman@ucdmath.ucdavis.edu (Mark Chrisman) wrote:
  779.  
  780. > How many of you would not consider using a tool if it's in C++? 
  781.  
  782. If this is an application, the language in which you coded it should be
  783. transparent to me or any other user.  I want to know that it always does
  784. the job right, and if possible, does it in a quick and easy fashion.
  785.  
  786. But if you're thinking of supplying your own game architecture or code
  787. snippets for other programmers, that's another story.  I'd say C++ is a
  788. great vehicle for reusable code.  IMHO, object oriented languages allow
  789. you to more easily maintain and upgrade an existing code base.  There is a
  790. speed and possible memory hit from the object oriented approach, and it
  791. can be substantial if you don't know what you're doing.  But if you code
  792. well in C++, you should be able to emerge with some really nice code which
  793. is also easy to upgrade and maintain.
  794.  
  795. Of course, haters of C++ will tell you this is also possible in a
  796. procedure- based language like C or Pascal.  They'll also remind you that
  797. C++ gives you more than enough rope to hang yourself.  But it's your call!
  798.  
  799. Jason
  800.  
  801. -- 
  802. Jason Regier
  803. GlobalStar Software Engineer
  804. QUALCOMM, Inc.
  805. (619) 658-4752
  806. jregier@qualcomm.com
  807.  
  808. +++++++++++++++++++++++++++
  809.  
  810. >From chrisman@ucdmath.ucdavis.edu (Mark Chrisman)
  811. Date: 14 Feb 1996 22:25:12 GMT
  812. Organization: Dept. of Computer & Information Science, NCTU, Taiwan
  813.  
  814. In article <jregier-1402960943240001@jregier-mac.qualcomm.com>,
  815. jregier@qualcomm.com (Jason Regier) wrote:
  816.  
  817. |In article <chrisman-1402960404220001@ppp059.inreach.com>,
  818. |chrisman@ucdmath.ucdavis.edu (Mark Chrisman) wrote:
  819. |
  820. |> How many of you would not consider using a tool if it's in C++? 
  821. |
  822. |if you're thinking of supplying your own game architecture or code
  823. |snippets for other programmers... I'd say C++ is a
  824. |great vehicle for reusable code.  IMHO, object oriented languages allow
  825. |you to more easily maintain and upgrade an existing code base.  There is a
  826. |speed and possible memory hit from the object oriented approach, and it
  827. |can be substantial if you don't know what you're doing.  
  828.  
  829. While we're at it, I wonder if someone could say a few words about the
  830. speed & memory hit from using C++.  I can see that there is a *small* (how
  831. small?) overhead in having to look up address of virtual functions.  And I
  832. can see that memory fragmentation might become a problem since C++ objects
  833. are pointers, not handles.  Are there other drawbacks?  What advice would
  834. you give to someone to wants to "know what they're doing"?
  835.  
  836. |But if you code
  837. |well in C++, you should be able to emerge with some really nice code which
  838. |is also easy to upgrade and maintain.
  839. |
  840. |Of course, haters of C++ will tell you this is also possible in a
  841. |procedure- based language like C or Pascal.  They'll also remind you that
  842. |C++ gives you more than enough rope to hang yourself.  But it's your call!
  843.  
  844. Well, yes, *I* am quite convinced that using C++ is a great idea.  My
  845. concern is really this:  How many of these C++ haters are there?  Will my
  846. neat tools go unused just because I decided to use C++?  
  847.  
  848. (If they go unused because they're no good...well, that's another issue :-)
  849.  
  850. -Mark
  851.  
  852. +++++++++++++++++++++++++++
  853.  
  854. >From kbs3387@silver.sdsmt.edu (Kevin Stone)
  855. Date: 14 Feb 1996 21:06:37 GMT
  856. Organization: South Dakota School of Mines and Technology
  857.  
  858. : For my game, I'm working on some modules that I intend to be re-usable
  859. : tools for other game programmers (that's you!).  
  860. : I'm planning an object-oriented approach, using C++.  My question is
  861. : this:  How many of you would not consider using a tool if it's in C++? 
  862. : (To use the tools, you would need to know C++, because you would have to
  863. : define some subclasses.)
  864.  
  865.    For the sake of humanity!! Don't do it!  Resist the evil forces of C++!!
  866.  
  867.    No... really.  If you don't use virtual functions (much) and try to 
  868.    keep down on inheriting multiple classes, you should be fine.  
  869.    Undoubtably, you will see a small speed hit using C++ instead of C, 
  870.    but sometimes the good's outweigh the means.
  871.    If speed isn't an issue for you, then I guess what I just said dosn't 
  872.    matter.
  873.  
  874. : Objections based on the computational overhead of OOP don't count.  Speed
  875. : is not an issue here, because the code is for things (e.g. preference
  876. : files) which won't be part of a real-time game loop.
  877.  
  878.    Like I said, if speed isn't an issue... it really dosn't matter.  
  879.    Personaly, I don't use C++ for several reasons (the main one is speed, 
  880.    and the lack there of).
  881.  
  882.    I guess what you really should be asking your self is... Do I NEED C++ 
  883.    to write this library.  Sometimes the answer is yes... sometimes the 
  884.    answer is no.  If you think you can take advantage of things like virtual 
  885.    functions and inheritance to make the tool easier to use, then I'd say 
  886.    go for it! :)
  887.  
  888. BAS
  889.  
  890.  
  891. +++++++++++++++++++++++++++
  892.  
  893. >From square@phoenix.princeton.edu (Hung F. Fong)
  894. Date: 15 Feb 1996 03:50:05 GMT
  895. Organization: Princeton University
  896.  
  897. In article <4ftist$81g@news.sdsmt.edu> kbs3387@silver.sdsmt.edu (Kevin Stone) writes:
  898. >   No... really.  If you don't use virtual functions (much) and try to 
  899. >   keep down on inheriting multiple classes, you should be fine.  
  900. >   Undoubtably, you will see a small speed hit using C++ instead of C, 
  901. >   but sometimes the good's outweigh the means.
  902. >   If speed isn't an issue for you, then I guess what I just said dosn't 
  903. >   matter.
  904. >
  905. >: Objections based on the computational overhead of OOP don't count.  Speed
  906. >: is not an issue here, because the code is for things (e.g. preference
  907. >: files) which won't be part of a real-time game loop.
  908. >
  909. >   Like I said, if speed isn't an issue... it really dosn't matter.  
  910. >   Personaly, I don't use C++ for several reasons (the main one is speed, 
  911. >   and the lack there of).
  912. >
  913. >   I guess what you really should be asking your self is... Do I NEED C++ 
  914. >   to write this library.  Sometimes the answer is yes... sometimes the 
  915. >   answer is no.  If you think you can take advantage of things like virtual 
  916. >   functions and inheritance to make the tool easier to use, then I'd say 
  917. >   go for it! :)
  918. >
  919. >BAS
  920. >
  921.  
  922. I disagree completely that C++ is slower than C, based on two things:
  923. - inlining in C++ allow you to do things where you normally would use
  924.   function calls in C due laziness. (e.g. complex assignment statements)
  925. - in the case of virtual functions it's the fastest way to implement
  926.   "polymorphism" in practice than your usual switch statement.
  927.   When do you use a virtual function? for example, let's say in your
  928.   game with many different kinds of draw() routines. in C without
  929.   exploiting function pointers it should look like:
  930.     switch(object.type) {
  931.     case PLAYER: /*blah blah blah*/
  932.     case BULLET1: /*blah blah blah*/
  933.     ...
  934.     default: /* error */
  935.     }
  936.   In c++? simply object->draw(); !!!
  937.   translated to C, this operation is basically equivalent to:
  938.     (*(object->vfuncTable[DRAW]))(object);
  939.   with the vfuncTable correctly reflecting the type of object
  940.   you're playing with.
  941.  
  942. But then, in an inner loop, one can ALWAYS go back to procedural paradigm.
  943. Therefore, I see absolutely no reason to abandon C++. While it gives
  944. you the power to simplify complicated design structure and yet the
  945. flexibility to write totally C efficency equivalent code in speed critical
  946. portion of the program. And mind you, the latter is not a large part at all.
  947.  
  948. HFF
  949.  
  950. +++++++++++++++++++++++++++
  951.  
  952. >From pottier@drakkar.ens.fr (Francois Pottier)
  953. Date: 15 Feb 1996 14:29:47 GMT
  954. Organization: Ecole Normale Superieure, Paris, France
  955.  
  956. In article <chrisman-1402961428400001@ppp068.inreach.com>,
  957. Mark Chrisman <chrisman@ucdmath.ucdavis.edu> wrote:
  958.  
  959. >While we're at it, I wonder if someone could say a few words about the
  960. >speed & memory hit from using C++.  I can see that there is a *small* (how
  961. >small?) overhead in having to look up address of virtual functions.  And I
  962. >can see that memory fragmentation might become a problem since C++ objects
  963. >are pointers, not handles.
  964.  
  965. The cost of virtual function calls is ridiculously low, except maybe in
  966. inner game loops. I use plenty of function calls in rather time-critical
  967. code with no problems.
  968.  
  969. As for the cost of using pointers instead of handles, well, there is a
  970. risk of fragmentation, but you are actually gaining a lot of speed by
  971. doing that.
  972.  
  973. > What advice would you give to someone to wants to "know what they're
  974. > doing"?
  975.  
  976. My advice would be to not worry too much about the language. Whatever
  977. language you choose, you should worry about the design of your
  978. API. Make it easy to understand, free of pitfalls, easily extendable,
  979. easily reusable, well documented, etc. Careful design can be done in C
  980. or C++. C++ does help you sometimes, for instance if your concepts map
  981. easily to a class hierarchy. It can also bite you in the ass, for
  982. instance if you think your concepts map to a class hierarchy and then
  983. later discover that the mapping is not perfect, start hacking with
  984. virtual base classes, etc.
  985.  
  986. Try to not over-use C++ features because they're "cool". Just use the
  987. features which are natural for your architecture.
  988.  
  989.  
  990. -- 
  991. Francois Pottier
  992. Francois.Pottier@ens.fr
  993. Francois.Pottier@inria.fr
  994. http://www.eleves.ens.fr:8080/home/pottier/
  995.  
  996. +++++++++++++++++++++++++++
  997.  
  998. >From johnb@hk.super.net (John W. Blackburne)
  999. Date: Thu, 15 Feb 1996 23:01:37 +0800
  1000. Organization: Tempest
  1001.  
  1002. In article <chrisman-1402960404220001@ppp059.inreach.com>,
  1003. chrisman@ucdmath.ucdavis.edu (Mark Chrisman) wrote:
  1004.  
  1005. :For my game, I'm working on some modules that I intend to be re-usable
  1006. :tools for other game programmers (that's you!).  
  1007. :
  1008. :I'm planning an object-oriented approach, using C++.  My question is
  1009. :this:  How many of you would not consider using a tool if it's in C++? 
  1010. :(To use the tools, you would need to know C++, because you would have to
  1011. :define some subclasses.)
  1012.  
  1013. At least one, me. I'm quite happy with C and have no immediate plans to
  1014. move to C++. I may end up working with it one day, but not for games
  1015. programs.
  1016.  
  1017. :Objections based on the computational overhead of OOP don't count.  Speed
  1018. :is not an issue here, because the code is for things (e.g. preference
  1019. :files) which won't be part of a real-time game loop.
  1020. :
  1021. :-Mark
  1022.  
  1023. John
  1024. -- 
  1025. John Blackburne,                     johnb@tempest.net.hk
  1026. Programmer  Asia, Inc. Online:       http://www.asia-inc.com
  1027. Technology consultant and trainer:   http://www.hk.super.net/~johnb
  1028.  
  1029. +++++++++++++++++++++++++++
  1030.  
  1031. >From bwade@qualia.com (Bretton Wade)
  1032. Date: Thu, 15 Feb 1996 11:28:27 -0500
  1033. Organization: qualia, inc.
  1034.  
  1035. I also disagree about the speed issue. In general, the biggest speed
  1036. problems come from poor design, and OOP is a significantly better design
  1037. tool than sequential programming.
  1038.  
  1039. -- 
  1040. bwade@qualia.com
  1041. http://www.qualia.com/
  1042.  
  1043. +++++++++++++++++++++++++++
  1044.  
  1045. >From dbshapco@bnr.ca (Brad Shapcott)
  1046. Date: 15 Feb 1996 20:04:22 GMT
  1047. Organization: Bell-Northern Research Ltd.
  1048.  
  1049. In article <bwade-1502961128270001@frost.qualia.com>,
  1050. Bretton Wade <bwade@qualia.com> wrote:
  1051. >I also disagree about the speed issue. In general, the biggest speed
  1052. >problems come from poor design, and OOP is a significantly better design
  1053. >tool than sequential programming.
  1054.  
  1055. An apocryphal story from a friend recounts a defense of direct system calls
  1056. into the Amiga OS from a group of amateur programmers, because they were
  1057. necessary for speed, despite the fact that Commodore advised against them
  1058. and would not guarantee compatability between OS releases.  (And predicatably,
  1059. the programs broke horribly across OS releases, meaning more hacks into the
  1060. code to fix compatability.)
  1061.  
  1062. Another programmer, presumably more professional, took the source for the
  1063. code in question and reprogrammed it using the documented OS calls and better
  1064. programming techniques.  The execution speed ended up faster.  The problem,
  1065. so it goes, lies not in the language choice, but in the programmer (in 90% of
  1066. cases).
  1067.  
  1068. Many beginning or ad hoc programmers develop a bad habit of using questionable
  1069. optimizations, whereas a bit of education in design, ADTs and execution
  1070. efficiency go a lot longer towards tight code that not only executes faster,
  1071. but is easier to maintain and upgrade.  I'm always suspicious when people
  1072. complain that they are being kept too far away from the machine, or don't
  1073. know why bubble sorts are bad, or don't comprehend the implications of
  1074. Turing Machine Equivalence.
  1075.  
  1076. C++ is a perfectly good language for such things.
  1077.  
  1078.  
  1079. Brad Shapcott
  1080.  
  1081. +++++++++++++++++++++++++++
  1082.  
  1083. >From zinger@cloudnet.com (Chris S. Dillman)
  1084. Date: 15 Feb 1996 21:40:54 GMT
  1085. Organization: Cloudnet, St. Cloud MN (612)-240-8259 login as guest
  1086.  
  1087.  
  1088. CW C++ SPEED HIT.
  1089.  
  1090. Ok I wrote Death from above in mostly CW C++.
  1091. At first it was barley playable on 68K.
  1092. But after some intense optimizations.
  1093. I got it to be nice a playable on a 25Mhz 040
  1094. Full screen Pixel Doubled and 32 channel music.
  1095.  
  1096. Even plays on a 20Mhz 040 for for megs ram and ramdoubler with music on.
  1097.  
  1098. any now C++ is great.
  1099. Speed it is minimal Unless you implement a VECTOR LIB Then the math is 
  1100. WAY way way slower.
  1101.  
  1102. Some guy on AOL did a comparision on that.
  1103.  
  1104. Any how I use lots of virtual FN in all my sprite code.
  1105. So whats the problem with useing virtual functions a lot???
  1106. Anyone???
  1107.  
  1108. (Im not a C++ Guru)
  1109.  
  1110.  
  1111.  
  1112. +++++++++++++++++++++++++++
  1113.  
  1114. >From asouthwick@vnet.ibm.com (Andrew R. Southwick)
  1115. Date: 15 Feb 1996 22:05:18 GMT
  1116. Organization: ISSC
  1117.  
  1118. I vote for C++.  If the library is useful, I want it.  If your library has
  1119. a clean, mix-in architecture, I can use it straight.   A note on source vs.
  1120. linkable libraries: if your architecture and library interface isn't clean,
  1121. using it is a pain in the ass.  I can read your source code, figure out the
  1122. underlying mechanisms, completely rewrite the functionality, and integrate
  1123. it seamlessly with my existing project FASTER than trying to use a poorly-
  1124. written, confusing, buggy, and needlessly complex library.  I've got so
  1125. much of my own framework written and working already that trying to adhere
  1126. to someone else's poor idea of an OO framework is trouble I don't want.
  1127.  
  1128. pottier@drakkar.ens.fr (Francois Pottier) writes:
  1129. >The cost of virtual function calls is ridiculously low, except maybe in
  1130. >inner game loops. I use plenty of function calls in rather time-critical
  1131. >code with no problems.
  1132.  
  1133. Depends on how many times your "inner loop" is called.  186,000 function
  1134. calls per frame is devastatingly slow, whether its direct dispatch or
  1135. virtual-function.  For time-critical, tight, and insanely popular (i.e.
  1136. frequently called) inner-inner-loops, NO function calls is the best
  1137. choice.  Also check your cache size: if your inner loops are larger than
  1138. the code cache size, recode.  My 5DOF engine looped, 320 times, through
  1139. code that was just slightly larger than the 4K cache on the 040.  I
  1140. rewrote it to concentrate in different areas (best case, it blows the
  1141. cache once for each frame generated, average case was around 20 or so
  1142. with the map I was using).
  1143.  
  1144. Optimizing code for games is really an assembly and compiler-technology
  1145. process, and is independent of the language you are using.  To do things
  1146. fast, you need to know more about your tools than the simple facts of
  1147. what operator-overloading is, etc.
  1148.  
  1149. >> What advice would you give to someone to wants to "know what they're
  1150. >> doing"?
  1151.  
  1152. Learn about compiler technology.  Get a book on it, plus an assembly
  1153. language manual (if you don't know ASM yet).  Ask direct questions about
  1154. what (eg) "blowing the cache" is, how to find out if you're doing it, etc.
  1155. Disassembly your source.  Learn about register coloring.  Learn general
  1156. optimization techniques.
  1157.  
  1158. Optimization is an entirely different issue than C vs. C++; the differences
  1159. between these languages make only a minor impact on your performance numbers.
  1160.  
  1161. A related issue is virtual functions in C++ vs. direct dispatch in C
  1162. (this serves nicely as an example of many of the "slow" mechanisms in C++
  1163. versus their fast "counterparts" in C).  Virtual function calls *are*
  1164. slower than direct dispatch, but you don't use them in C++ as a parallel
  1165. to direct dispatch in C; they replace function pointers and switch
  1166. statements, not function calls themselves.
  1167.  
  1168. Summary: The "C++ is slower than C" argument is a communist plot.  Using
  1169.   C++ correctly is an easy task, but you have to think in C++, which does
  1170.   take a lot of effort to learn how to do.  Further, optimizing code is
  1171.   an almost entirely separate matter.
  1172.  
  1173.  
  1174. Andrew R Southwick          -={C++/OO Programmer}=-     asouthwick@vnet.ibm.com
  1175. #include <stddisclaimer.h>                                 I speak not for IBM.
  1176.             -= Freedom by permission is a contradiction in terms =-
  1177.  
  1178.  
  1179. +++++++++++++++++++++++++++
  1180.  
  1181. >From dbshapco@bnr.ca (Brad Shapcott)
  1182. Date: 16 Feb 1996 16:31:03 GMT
  1183. Organization: Bell-Northern Research Ltd.
  1184.  
  1185. In article <4g0996$75v@orion.cloudnet.com>,
  1186. Chris S. Dillman <zinger@cloudnet.com> wrote:
  1187. >
  1188. >Any how I use lots of virtual FN in all my sprite code.
  1189. >So whats the problem with useing virtual functions a lot???
  1190. >Anyone???
  1191.  
  1192. Overhead for virtual functions is negligible.  Pushing a large parameter list
  1193. on the stack would be much more costly.  Another thing to be suspicious of:
  1194. programmers who are afraid of virtuals functions because of performance costs.
  1195.  
  1196.  
  1197. Brad Shapcott
  1198.  
  1199. +++++++++++++++++++++++++++
  1200.  
  1201. >From jmunkki@beta.hut.fi (Juri Munkki)
  1202. Date: 17 Feb 1996 18:27:10 GMT
  1203. Organization: Helsinki University of Technology
  1204.  
  1205. In article <4g2bg7$cr0@bmerhc5e.bnr.ca> dbshapco@bnr.ca (Brad Shapcott) writes:
  1206. >In article <4g0996$75v@orion.cloudnet.com>,
  1207. >Chris S. Dillman <zinger@cloudnet.com> wrote:
  1208. >>Any how I use lots of virtual FN in all my sprite code.
  1209. >>So whats the problem with useing virtual functions a lot???
  1210. >>Anyone???
  1211.  
  1212. >Overhead for virtual functions is negligible.  Pushing a large parameter list
  1213. >on the stack would be much more costly.  Another thing to be suspicious of:
  1214. >programmers who are afraid of virtuals functions because of performance costs.
  1215.  
  1216. I make all methods virtual, but I still use Think C with object extensions.
  1217. The nice thing about Think C is that it knows how to optimize monomorphic
  1218. methods...meaning that if you only have a single instance of a virtual
  1219. function, it becomes non-virtual at link time.
  1220.  
  1221. I don't think any real C++ compilers know how to do that, but please correct
  1222. me if I'm wrong. I would be delighted if Codewarrior supported it.
  1223.  
  1224. -- 
  1225. Juri Munkki jmunkki@iki.fi        Life is easy when polygons are cheap.
  1226. http://www.iki.fi/jmunkki           Windsurfing: Faster than the wind.
  1227.  
  1228. +++++++++++++++++++++++++++
  1229.  
  1230. >From howard@sirius.com (Howard Berkey)
  1231. Date: 17 Feb 1996 22:00:47 GMT
  1232. Organization: Weyland-Yutani Thinking Machines Division
  1233.  
  1234. In article <4fvg0r$4pj@nef.ens.fr>, pottier@drakkar.ens.fr (Francois
  1235. Pottier) wrote:
  1236. > Try to not over-use C++ features because they're "cool". Just use the
  1237. > features which are natural for your architecture.
  1238.  
  1239. This is very good advice...
  1240.  
  1241. Alternatively, if someone was a strong vanilla-c programmer debating
  1242. whether or not to use C++ for a library, I'd suggest perhaps just using
  1243. C++ as a "better C" for the first project, taking advantage of the things
  1244. that can directly benefit a C programmer, like using inlined functions for
  1245. effeciency, simple classes rather than structures for data types, and
  1246. function overloading rather than varargs for simplicity in API development
  1247. when you have several ways you want to be able to call a function.  These
  1248. things are all very cool and can directly benefit a C programmer without
  1249. getting into C++'s more complex features like templates.
  1250.  
  1251. -H-
  1252.  
  1253. -- 
  1254. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  1255. Howard Berkey, PP-ASEL, DoD #0944                   howard@sirius.com
  1256. http://www.sirius.com/~howard
  1257.  
  1258. +++++++++++++++++++++++++++
  1259.  
  1260. >From Thomas DeWeese <deweese@image.kodak.com>
  1261. Date: Mon, 19 Feb 1996 10:16:43 -0500
  1262. Organization: Eastman Kodak
  1263.  
  1264. Mark Chrisman wrote:
  1265. > In article <jregier-1402960943240001@jregier-mac.qualcomm.com>,
  1266. > jregier@qualcomm.com (Jason Regier) wrote:
  1267. > |In article <chrisman-1402960404220001@ppp059.inreach.com>,
  1268. > |chrisman@ucdmath.ucdavis.edu (Mark Chrisman) wrote:
  1269. > |
  1270. > |IMHO, object oriented languages allow
  1271. > |you to more easily maintain and upgrade an existing code base.  There is a
  1272. > |speed and possible memory hit from the object oriented approach, and it
  1273. > |can be substantial if you don't know what you're doing.
  1274. > While we're at it, I wonder if someone could say a few words about the
  1275. > speed & memory hit from using C++.
  1276.  
  1277. > I can see that there is a *small* (how small?) overhead in having to look up
  1278. > address of virtual functions.  And I can see that memory fragmentation might
  1279. > become a problem since C++ objects are pointers, not handles.  Are there
  1280. > other drawbacks?  What advice would you give to someone to wants to 
  1281. > "know what they're doing"?
  1282.  
  1283.     The real things to look out for are not what you have listed.  The
  1284. most dangerous thing in C++ is that it tends to make you feel like you have
  1285. more control over what is happening than you actually have.  It is very
  1286. easy for a simple looking line of code to actually be a serious speed hit.
  1287.  
  1288. Some stuff to look out for: 
  1289.     Small classes - It is very enticing to create small classes that
  1290. 'help' you do your work (like a 2Dpoint class).  The thing to watch out
  1291. for is the hidden overhead of such classes.  Depending on what the class
  1292. contains the construction of such an object can easily balloon from 2 move
  1293. instructions to 20-30 instructions for setting up a V-table, calling the
  1294. constructor initializing the values and returning.  This can get much worse
  1295. if you have type converters which are constantly creating and destroying
  1296. temporaries.
  1297.  
  1298.     Inlines that don't get inlined.  While it is very nice that C++
  1299. offers the inline declairation take it with a grain of salt (a _very_large_
  1300. grain of salt).  There are numerous cases where inlines do not get inlined,
  1301. and worse yet those cases vary from compiler to compiler.  So as an example,
  1302. I use a set of macros that define get/set functions for data members (so I
  1303. can have public read, protected write).  I have extensively tested these
  1304. macros to make sure that the get inlined under the majority of circumstances
  1305. (they are pretty simple).  Well I was writting some test code and I moved
  1306. some code into inlines in the definition of the class (above my data member
  1307. definitions).  Suddenly my code ran _slower_.  I checked and the moved code
  1308. was being inlined...
  1309. eventually I noticed that the data accessed were _not_ being inlined because
  1310. the 'inline' functions were being used before the inline declairation.  The
  1311. compiler was completely free not to inline, and the program did the right
  1312. thing, just _very_ slowly.
  1313.  
  1314.     Class Data Members, for what ever reason code like the following
  1315. tends to be very poorly optomized:
  1316.  
  1317. class iter
  1318. {
  1319.   public:
  1320.     iter(char *start, char *end){ptr=start; endPtr=end;}
  1321.     iter &operator++(void) {ptr++; return *this}
  1322.     char get(void)const{return *ptr;}
  1323.     bool_t done(void)const {return ptr>=endPtr;}
  1324.   protected:
  1325.     char *ptr, *endPtr;
  1326. }
  1327.  
  1328. ...
  1329. for (iter I(start,end);!I.done();I++)
  1330.    {...
  1331.      x = I.get();
  1332.     ... }
  1333.  
  1334. Many compilers feel the need to load and store I.ptr at every iteration,
  1335. as well as loading endPtr for the check.  Of lesser concern many 
  1336. compilers refuse to optomize accross inline function boundries (moving
  1337. assignments around to keep the pipeline from stalling etc).
  1338.  
  1339. The real problem here is that if you _depend_ on the function being inlined
  1340. for speed you have to constantly be rechecking the code to see if it is still
  1341. being inlined because there are _lots_ of things that can code to suddenly
  1342. stop being inlined.
  1343.  
  1344. For this reason I have started to move away from relying on inlining, and
  1345. using the tried and true methods of macros, and hand expansion/machine
  1346. code generation.  I don't like it but it can be a nightmare to track down
  1347. what is being inlined and what isn't.  I don't have these problems with
  1348. these 'more traditional' methods.
  1349.  
  1350. If you are looking for flexability and speed is secondary C++ is wonderful.
  1351. But never underestimate the affect of an extra load/store to main memory,
  1352. in the wrong place, on program performance.
  1353.  
  1354. > My concern is really this:  How many of these C++ haters are there?  Will my
  1355. > neat tools go unused just because I decided to use C++?
  1356.  
  1357.     For stuff like preferences most of my comments are irrelivant.  If
  1358. a person is writting his program all in pascal they won't use your stuff.  If
  1359. most of the program is C they might learn enough C++ to use your stuff (depends
  1360. a lot on how hard your stuff is to use, ehh?).
  1361. --
  1362.                                 Thomas DeWeese
  1363. deweese@kodak.com
  1364.  
  1365. +++++++++++++++++++++++++++
  1366.  
  1367. >From monnet@alpes-net.fr (Nicolas Monnet)
  1368. Date: Mon, 19 Feb 1996 23:10:09 +0100
  1369. Organization: Ensieg/I.N.P.G.
  1370.  
  1371. In article (Dans l'article) <3128945B.35E6@image.kodak.com>, Thomas
  1372. DeWeese <deweese@image.kodak.com> wrote (écrivait) :
  1373.  
  1374. > Mark Chrisman wrote:
  1375.  
  1376. >         The real things to look out for are not what you have listed.  The
  1377. > most dangerous thing in C++ is that it tends to make you feel like you have
  1378. > more control over what is happening than you actually have.  It is very
  1379. > easy for a simple looking line of code to actually be a serious speed hit.
  1380. > Some stuff to look out for: 
  1381. >         Small classes - It is very enticing to create small classes that
  1382. > 'help' you do your work (like a 2Dpoint class).  The thing to watch out
  1383. > for is the hidden overhead of such classes.  Depending on what the class
  1384. > contains the construction of such an object can easily balloon from 2 move
  1385. > instructions to 20-30 instructions for setting up a V-table, calling the
  1386.  
  1387. It's easy to type "=" instead of "==", but I cannot imagine typing
  1388. "virtual" accidentally... except if one does not know what it means!
  1389.  
  1390. > constructor initializing the values and returning.  This can get much worse
  1391. > if you have type converters which are constantly creating and destroying
  1392. > temporaries.
  1393.  
  1394. One surely needs to understand perfectly object instanciation to properly
  1395. use C++. I'm not sure I do understand all the subtleties -- but, I
  1396. understand 68k ML and I'm always able to take a look at the code
  1397. produced...
  1398.  
  1399.  >         Inlines that don't get inlined.  While it is very nice that C++
  1400.  > offers the inline declairation take it with a grain of salt (a _very_large_
  1401.  > grain of salt).  There are numerous cases where inlines do not get inlined,
  1402.  > and worse yet those cases vary from compiler to compiler.  So as an example,
  1403.  > I use a set of macros that define get/set functions for data members (so I
  1404.  > can have public read, protected write).  I have extensively tested these
  1405.  > macros to make sure that the get inlined under the majority of circumstances
  1406.  > (they are pretty simple).  Well I was writting some test code and I moved
  1407.  > some code into inlines in the definition of the class (above my data member
  1408.  > definitions).  Suddenly my code ran _slower_.  I checked and the moved code
  1409.  > was being inlined...
  1410.  
  1411.    Then it might be helpful that the compiler generate a report about
  1412. inlining -- why it did'nt inline and why. 
  1413.    Every compiler has its specifics; CW inlining scheme is described
  1414. rather precisely in a note, I remember. The issue is: if one uses C++ and
  1415. needs speed, then he needs to know those possible bottlenecks.  
  1416.  
  1417.  > eventually I noticed that the data accessed were _not_ being inlined because
  1418.  > the 'inline' functions were being used before the inline declairation.  The
  1419.  > compiler was completely free not to inline, and the program did the right
  1420.  > thing, just _very_ slowly.
  1421.  > 
  1422.  >         Class Data Members, for what ever reason code like the following
  1423.  > tends to be very poorly optomized:
  1424.  > 
  1425.  > class iter
  1426.  > {
  1427.  >   public:
  1428.  >     iter(char *start, char *end){ptr=start; endPtr=end;}
  1429.  >     iter &operator++(void) {ptr++; return *this}
  1430.  >      char get(void)const{return *ptr;}
  1431.  >      bool_t done(void)const {return ptr>=endPtr;}
  1432.  >   protected:
  1433.  >     char *ptr, *endPtr;
  1434.  > }
  1435.  > 
  1436.  > ...
  1437.  > for (iter I(start,end);!I.done();I++)
  1438.  >    {...
  1439.  >      x = I.get();
  1440.  >     ... }
  1441.  > 
  1442.  > Many compilers feel the need to load and store I.ptr at every iteration,
  1443.  > as well as loading endPtr for the check.  Of lesser concern many 
  1444.  > compilers refuse to optomize accross inline function boundries (moving
  1445.  > assignments around to keep the pipeline from stalling etc).
  1446.  > 
  1447.  > The real problem here is that if you _depend_ on the function being inlined
  1448.  > for speed you have to constantly be rechecking the code to see if it is still
  1449.  > being inlined because there are _lots_ of things that can code to suddenly
  1450.  > stop being inlined.
  1451.  > 
  1452.  > For this reason I have started to move away from relying on inlining, and
  1453.  > using the tried and true methods of macros, and hand expansion/machine
  1454.  > code generation.  I don't like it but it can be a nightmare to track down
  1455.  > what is being inlined and what isn't.  I don't have these problems with
  1456.  > these 'more traditional' methods.
  1457.  > 
  1458.  > If you are looking for flexability and speed is secondary C++ is wonderful.
  1459.  > But never underestimate the affect of an extra load/store to main memory,
  1460.  > in the wrong place, on program performance.
  1461.  
  1462. <snip>
  1463. > --
  1464. >                                                                 Thomas DeWeese
  1465. > deweese@kodak.com
  1466.  
  1467. +++++++++++++++++++++++++++
  1468.  
  1469. >From PaulS101@mailbox.ioa.com (Paul Sexton)
  1470. Date: Mon, 19 Feb 1996 23:55:23 -0500
  1471. Organization: Vnet Internet Access, Charlotte, NC - info@char.vnet.net
  1472.  
  1473. In article <jregier-1402960943240001@jregier-mac.qualcomm.com>,
  1474. jregier@qualcomm.com (Jason Regier) wrote:
  1475.  
  1476. > In article <chrisman-1402960404220001@ppp059.inreach.com>,
  1477. > chrisman@ucdmath.ucdavis.edu (Mark Chrisman) wrote:
  1478. > > How many of you would not consider using a tool if it's in C++? 
  1479. The main problem is that c++ libraries tend to be compiler specific, so
  1480. you wind up supporting (at least recompiling) individually for all the
  1481. major systems.  CW has had problems with libraries breaking on each
  1482. release.
  1483.  
  1484. I use C++ exclusively (even on "pure" C code that doesn't need OOP) to get
  1485. the extra features and convenience.  But if I was going to put out a
  1486. library for others to use, I'd probably use straight C.
  1487.  
  1488. Paul
  1489.  
  1490. -- 
  1491.  
  1492. This posting was produced in a Microsoft free environment
  1493. for your protection.
  1494.  
  1495. +++++++++++++++++++++++++++
  1496.  
  1497. >From jregier@qualcomm.com (Jason Regier)
  1498. Date: Tue, 20 Feb 1996 10:24:54 -0800
  1499. Organization: Qualcomm, Inc.
  1500.  
  1501. In article <3128945B.35E6@image.kodak.com>, Thomas DeWeese
  1502. <deweese@image.kodak.com> wrote:
  1503.  
  1504. > Some stuff to look out for: 
  1505. >         Small classes - It is very enticing to create small classes that
  1506. > 'help' you do your work (like a 2Dpoint class).  The thing to watch out
  1507. > for is the hidden overhead of such classes.
  1508. >
  1509. Yep, this is totally true.  But if you know C++ well, then you should know
  1510. when constructors and destructors are called, and when default
  1511. constructors and destructors are created, etc.  People say this all the
  1512. time-- C++ has a lot of flexibility, but it also has a lot of pitfalls as
  1513. well.
  1514.  
  1515. >         Inlines that don't get inlined.
  1516. >
  1517. Well, I think inlining is a pretty nice feature, supported exclusively in
  1518. C++.  But like all "features", there are some pretty serious drawbacks, as
  1519. you mentioned.  Not all compilers inline all functions declared as inlined
  1520. (especially inlined virtual functions, which very few compilers inline). 
  1521. That's the breaks, I guess, but if the compiler inlines like it should,
  1522. you're still somewhat better off than you are in C.
  1523.  
  1524. Ah, but then why not inline all your functions?  One of the major
  1525. drawbacks to inlining is the possible resulting code bloat, which means
  1526. bigger application sizes.  And if you're trying to optimize some code and
  1527. you inline it, there's the possibility that the generated code won't fit
  1528. in the cache, and you may actually degrade the performance of your code. 
  1529. It all sorta depends.  Inlining is a nice option, but it's not a panacea
  1530. to all programming problems.  Like any C++ feature, use it judiciously.
  1531.  
  1532. For anybody who's just listening in on this thread, don't be fooled into
  1533. thinking that the above list is an extensive list of C++ pitfalls. 
  1534. There's a ton of little gotchas, and I think it's better to learn about
  1535. them from a good C++ book instead of a news thread.
  1536.  
  1537. Jason
  1538.  
  1539. -- 
  1540. Jason Regier
  1541. GlobalStar Software Engineer
  1542. QUALCOMM, Inc.
  1543. (619) 658-4752
  1544. jregier@qualcomm.com
  1545.  
  1546. +++++++++++++++++++++++++++
  1547.  
  1548. >From brian@www.tmarts.com (Brian Gray)
  1549. Date: 23 Feb 1996 19:38:04 GMT
  1550. Organization: TM Interactive Inc.
  1551.  
  1552. In article <4fuahd$j52@cnn.Princeton.EDU>, square@phoenix.princeton.edu
  1553. (Hung F. Fong) wrote:
  1554.  
  1555. > - inlining in C++ allow you to do things where you normally would use
  1556. >   function calls in C due laziness. (e.g. complex assignment statements)
  1557.  
  1558.   Actually, when you inline a function in C++, the compiler often has the
  1559. option of ignoring your request and refusing to inline it, treating it as
  1560. a normal function with the standard overhead thus associated.  This
  1561. happens usually when you attempt to inline a function that is longer than
  1562. a given amount determined by the compiler.  I'd say in this respect C++
  1563. offers inlining as a crutch that may deny you support at any minute.
  1564.   The more controlled alternative, which is also available in C, is using
  1565. macros.  Keep in mind though that when the compiler decides not to inline
  1566. a function so defined in the code, it usually does it because the added
  1567. memory footprint of 50 copies of a 10-line function overrides the
  1568. importance of the gained speed.  It's nice of the compiler to look out for
  1569. my well-being, but I'd rather take responsibility for my own code.
  1570.  
  1571. -- 
  1572. Brian Gray, Multimedia Manager
  1573. TM Interactive, Inc.
  1574. 9696 Culver Blvd., Suite 105
  1575. Culver City, CA 90232
  1576. (310)837-8377 x124
  1577.  
  1578. +++++++++++++++++++++++++++
  1579.  
  1580. >From "Mark H. DeForest" <markd@cyan.com>
  1581. Date: Mon, 26 Feb 1996 13:41:37 -0800
  1582. Organization: Cyan, Inc.
  1583.  
  1584. Brian Gray wrote:
  1585. > In article <4fuahd$j52@cnn.Princeton.EDU>, square@phoenix.princeton.edu
  1586. > (Hung F. Fong) wrote:
  1587. > > - inlining in C++ allow you to do things where you normally would use
  1588. > >   function calls in C due laziness. (e.g. complex assignment statements)
  1589. >   Actually, when you inline a function in C++, the compiler often has the
  1590. > option of ignoring your request and refusing to inline it, treating it as
  1591. > a normal function with the standard overhead thus associated.  This
  1592. > happens usually when you attempt to inline a function that is longer than
  1593. > a given amount determined by the compiler.  I'd say in this respect C++
  1594. > offers inlining as a crutch that may deny you support at any minute.
  1595.  
  1596. On a number of C++ compilers, you can control the inline function size (I 
  1597. haven't found this in CW8, though). And some C++ compilers will automatically 
  1598. turn a small function into an inline function as an optimization (kind of like 
  1599. the "register" keyword is just a suggestion to the compiler), so you may be 
  1600. getting this benefit even if your coding in C, but using a C++ compiler.
  1601.  
  1602. >   The more controlled alternative, which is also available in C, is using
  1603. > macros.
  1604.  
  1605. The intrusive manner of macros, not really being functions, but treated as such 
  1606. (like a multi-statement macro used in an if-statement) is one of the reasons why 
  1607. inline functions were created.
  1608.  
  1609. >  Keep in mind though that when the compiler decides not to inline
  1610. > a function so defined in the code, it usually does it because the added
  1611. > memory footprint of 50 copies of a 10-line function overrides the
  1612. > importance of the gained speed.  It's nice of the compiler to look out for
  1613. > my well-being, but I'd rather take responsibility for my own code.
  1614.  
  1615. Most optimizing compilers allow you to control this. You can pick compiler 
  1616. setting that favor speed over memory footprint. This is much easier to change 
  1617. than if you had a lot of macros and allows you to use the tool to help find the 
  1618. best fit for your situation rather than changing a lot of code.
  1619.  
  1620.  
  1621. mark
  1622.  
  1623. - - _ -----------------------------------------------------
  1624.    /              Mark H. DeForest    mailto:markd@cyan.com
  1625.    \_/                                http://www.cyan.com
  1626.  C Y A N
  1627.  
  1628. ---------------------------
  1629.  
  1630. >From nagle@netcom.com (John Nagle)
  1631. Subject: Removing a Gestalt entry - possible?
  1632. Date: Tue, 20 Feb 1996 03:33:23 GMT
  1633. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  1634.  
  1635.      Is there any way to remove a Gestalt entry?  I'd like to do
  1636. this when a driver gets unloaded.  Resetting the Gestalt entry
  1637. to nil seems like a bad idea.  Any ideas?  Thanks.
  1638.  
  1639.                     John Nagle
  1640.  
  1641. +++++++++++++++++++++++++++
  1642.  
  1643. >From jumplong@aol.com (Jump Long)
  1644. Date: 20 Feb 1996 02:58:59 -0500
  1645. Organization: America Online, Inc. (1-800-827-6364)
  1646.  
  1647. John Nagle wrote:
  1648. >Is there any way to remove a Gestalt entry?  I'd like to do this
  1649. >when a driver gets unloaded.  Resetting the Gestalt entry to nil
  1650. >seems like a bad idea.  Any ideas?  Thanks.
  1651.  
  1652. The easiest way to solve this problem is to use the GestaltValue library
  1653. from Apple. It gives you three new calls (which are traps in System 7.5
  1654. and later) that make installing, changing and removing a Gestalt selector
  1655. easy and painless. The calls in the library are:
  1656.  
  1657. pascal OSErr NewGestaltValue (OSType selector, long newValue);
  1658. pascal OSErr ReplaceGestaltValue (OSType selector, long replacementValue);
  1659. pascal OSErr DeleteGestaltValue (OSType selector);
  1660.  
  1661. I've used the GestaltValue library in lots of code and it works great.
  1662.  
  1663. - Jim Luther
  1664.  
  1665. +++++++++++++++++++++++++++
  1666.  
  1667. >From nagle@netcom.com (John Nagle)
  1668. Date: Tue, 20 Feb 1996 19:06:25 GMT
  1669. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  1670.  
  1671. jumplong@aol.com (Jump Long) writes:
  1672. >John Nagle wrote:
  1673. >>Is there any way to remove a Gestalt entry?  I'd like to do this
  1674. >>when a driver gets unloaded.  Resetting the Gestalt entry to nil
  1675. >>seems like a bad idea.  Any ideas?  Thanks.
  1676.  
  1677. >The easiest way to solve this problem is to use the GestaltValue library
  1678. >from Apple. It gives you three new calls (which are traps in System 7.5
  1679. >and later) that make installing, changing and removing a Gestalt selector
  1680. >easy and painless. The calls in the library are:
  1681.  
  1682. >pascal OSErr NewGestaltValue (OSType selector, long newValue);
  1683. >pascal OSErr ReplaceGestaltValue (OSType selector, long replacementValue);
  1684. >pascal OSErr DeleteGestaltValue (OSType selector);
  1685.  
  1686.      Do you have a URL?  Apple's technote search engine is down today.
  1687. Thanks.
  1688.  
  1689.                     John Nagle
  1690.  
  1691. +++++++++++++++++++++++++++
  1692.  
  1693. >From reed@medicine.wustl.edu (Thomas Reed)
  1694. Date: Wed, 21 Feb 1996 09:50:51 -0600
  1695. Organization: Washington University
  1696.  
  1697. In article <nagleDn21vn.1EK@netcom.com>, nagle@netcom.com (John Nagle) wrote:
  1698.  
  1699. >     Is there any way to remove a Gestalt entry?  I'd like to do
  1700. >this when a driver gets unloaded.  Resetting the Gestalt entry
  1701. >to nil seems like a bad idea.  Any ideas?  Thanks.
  1702.  
  1703. There's no way to remove one, but you can fake it!  ;-)
  1704.  
  1705. If you can find a way to return a pointer to a function in your Gestalt
  1706. handler's code resource, it's easy.  You can do this several ways.  One,
  1707. install TWO Gestalts, one that returns the address of a SetVars function
  1708. (for setting some variables internal to the code resource), and another to
  1709. tell if your driver is installed.  Two, have your handler return a pointer
  1710. to a block of data containing your return value and a pointer to SetVars. 
  1711. Depends on how you want it to behave.
  1712.  
  1713. In the code resource, define a Boolean global variable to tell you whether
  1714. or not you're installed.  Then, when your handler is called, check the
  1715. global and return an appropriate value.  To "remove" your handler, call
  1716. SetVars to change the value of the global to FALSE.
  1717.  
  1718. Good luck!
  1719.  
  1720. -Thomas
  1721.  
  1722. =====================================================
  1723. Thomas Reed                     Washington University
  1724. reed@visar.wustl.edu               Medical School
  1725. reed@medicine.wustl.edu            Saint Louis, MO
  1726. http://medinfo.wustl.edu/~reed
  1727. - ---------------------------------------------------
  1728. Clothes make the man.  Naked people have little or no
  1729. influence on society.  -- Mark Twain
  1730. =====================================================
  1731.  
  1732. Opinions posted are not the opinions of Wash. U.
  1733.  
  1734. +++++++++++++++++++++++++++
  1735.  
  1736. >From dnebing@epix.net (Dave Nebinger)
  1737. Date: Fri, 23 Feb 1996 10:34:37 -0500
  1738. Organization: KHP Services, Inc
  1739.  
  1740. In article <nagleDn21vn.1EK@netcom.com>, nagle@netcom.com (John Nagle) wrote:
  1741.  
  1742. >      Is there any way to remove a Gestalt entry?  I'd like to do
  1743. > this when a driver gets unloaded.  Resetting the Gestalt entry
  1744. > to nil seems like a bad idea.  Any ideas?  Thanks.
  1745. >                                         John Nagle
  1746.  
  1747. How about returning the status of the driver (loaded/unloaded)
  1748. in the Gestalt selector?  Let the gestalt user worry about whether
  1749. it is loaded or not.
  1750.  
  1751. Dave
  1752.  
  1753. ==========================================================
  1754. Dave Nebinger                             dnebing@epix.net
  1755.              The Alt.Sources.Mac Archivist
  1756.      <http://www.AmbrosiaSW.com/alt.sources.mac/>
  1757.     <ftp://ftp.AmbrosiaSW.com/pub/alt.sources.mac/>
  1758.  
  1759. +++++++++++++++++++++++++++
  1760.  
  1761. >From jonasw@lysator.liu.se (Jonas Wallden)
  1762. Date: 25 Feb 1996 13:00:05 GMT
  1763. Organization: (none)
  1764.  
  1765. jumplong@aol.com (Jump Long) writes:
  1766.  
  1767. >The easiest way to solve this problem is to use the GestaltValue library
  1768. >from Apple. It gives you three new calls (which are traps in System 7.5
  1769. >and later) that make installing, changing and removing a Gestalt selector
  1770. >easy and painless. The calls in the library are:
  1771. >
  1772. >pascal OSErr NewGestaltValue (OSType selector, long newValue);
  1773. >pascal OSErr ReplaceGestaltValue (OSType selector, long replacementValue);
  1774. >pascal OSErr DeleteGestaltValue (OSType selector);
  1775. >
  1776. >I've used the GestaltValue library in lots of code and it works great.
  1777.  
  1778. GestaltValue is a great idea, but unfortunately I haven't found a way
  1779. to link PowerPC code that calls these routines. I've looked through
  1780. the CW8 libraries and the latest Developer CDs but couldn't find a
  1781. stub library where these functions are defined.
  1782.  
  1783. ...............  .......................  ...................................
  1784.  jonas wallden       internet e-mail            world wide web homepage
  1785.    mac hacker     jonasw@lysator.liu.se    http://www.lysator.liu.se/~jonasw
  1786.  
  1787. +++++++++++++++++++++++++++
  1788.  
  1789. >From pottier@drakkar.ens.fr (Francois Pottier)
  1790. Date: 25 Feb 1996 15:53:09 GMT
  1791. Organization: Ecole Normale Superieure, Paris, France
  1792.  
  1793. In article <4gpmgl$cvf@newsy.ifm.liu.se>,
  1794. Jonas Wallden <jonasw@lysator.liu.se> wrote:
  1795.  
  1796. >GestaltValue is a great idea, but unfortunately I haven't found a way
  1797. >to link PowerPC code that calls these routines. I've looked through
  1798. >the CW8 libraries and the latest Developer CDs but couldn't find a
  1799. >stub library where these functions are defined.
  1800.  
  1801. GestaltValue doesn't exist on PowerPC. This library was needed because
  1802. it was rather hard to set up a Gestalt selector with its own global
  1803. storage. Now, any code fragment comes with globals so it's much easier
  1804. to write a Gestalt selector.
  1805.  
  1806. Agreedly they could have provided it, if only for source code
  1807. compatibility.
  1808.  
  1809. -- 
  1810. Francois Pottier
  1811. Francois.Pottier@ens.fr
  1812. Francois.Pottier@inria.fr
  1813. http://www.eleves.ens.fr:8080/home/pottier/
  1814.  
  1815. +++++++++++++++++++++++++++
  1816.  
  1817. >From jumplong@aol.com (Jump Long)
  1818. Date: 26 Feb 1996 02:39:14 -0500
  1819. Organization: America Online, Inc. (1-800-827-6364)
  1820.  
  1821. John Nagle wrote:
  1822. >Do you have a URL (to GestaltValue)?  Apple's technote search
  1823. >engine is down today. Thanks.
  1824.  
  1825. Sure, GestaltValue is available at
  1826. <ftp://ftp.info.apple.com/Apple.Support.Area/Developer_Services/Tool_Chest
  1827. /OS_Utilities/GestaltValue.sit.hqx>.
  1828.  
  1829. Jonas Wallden wrote:
  1830. >GestaltValue is a great idea, but unfortunately I haven't found
  1831. >a way to link PowerPC code that calls these routines. I've
  1832. >looked through the CW8 libraries and the latest Developer CDs
  1833. >but couldn't find a stub library where these functions are
  1834. >defined.
  1835.  
  1836. and then Francois Pottier wrote:
  1837. >GestaltValue doesn't exist on PowerPC. This library was needed
  1838. >because it was rather hard to set up a Gestalt selector with its
  1839. >own global storage. Now, any code fragment comes with globals so
  1840. >it's much easier to write a Gestalt selector.
  1841. >
  1842. >Agreedly they could have provided it, if only for source code
  1843. >compatibility.
  1844.  
  1845. To use the GestaltValue 68K library from PowerPC code, you can stick the
  1846. library in a stand-alone code 68K resource, and add some wrapper glue that
  1847. loads the code resource and calls the routines. I wrote that code tonight
  1848. and I've attached an archive below in BinHex 4.0 format.
  1849.  
  1850. Since the three GestaltValue routines are available to non-CFM
  1851. applications if SystemSevenFiveOrLater is defined and true, my additional
  1852. code is added to your application only if GENERATINGCFM is true or
  1853. SystemSevenFiveOrLater is false. This allows you to build your programs
  1854. FAT without changing any of your source code.
  1855.  
  1856. The archive also includes a little CodeWarrior PPC test program just to
  1857. show that it works.
  1858.  
  1859. Hope this helps(tm)
  1860.  
  1861. - Jim Luther
  1862.  
  1863. (This file must be converted with BinHex 4.0)
  1864. :&&"33b"(CA0dB@ad9Q&XG@8ZFfPd!&0*9%46593K!*!%*#N!N!55fP0*9#%!!3!
  1865. !*#Pb6'&e!NF!N!-@E(3J)""38%-J4f9cG'&XG&CKE(9P!*!2I%X!N!-j!"-"D`)
  1866. A!*!$#3#3$iB!!!-!rj!%!3#Y9QqZV9Cr(!#3"Q!!N!FMS`#3#R-T!!d14f9cG'&
  1867. XG&CKE(9P,QJ!N"%iK3#3%4B!!!(A!*!$&[q3"&4&@&408&-J!3#Q)cjlV9Cr$!#
  1868. 3"J)8!*!(i3!!PK`!N!D,T9&#KA6[`i4kj(0MReF,A*`[l(9R!af,r%'Je-K!UND
  1869. M&),@[M"f"h&(Gj!!mb8c3U%3!$eNXj%rNm%%0Jckb(h!FYL(C-!FmL6(Z+!,"N%
  1870. 1K32N#rY3a1F9#[mYUdcNErNc3PjI"ZM9Ul8acD@cZ$VU,"f-[AS*Dj'8(r+Y$Xk
  1871. 4h5i1BaV2mN1H)1IeJDDZE0BA6QDD#f[j3PjrKP$)ZX-HGa$Bdi`)!CX[ZV4p%0[
  1872. 6H##%I8'I"d25G`"$Q5$NLqENLdf@icXq0ZMfq$j6L(04!emSPh1MdL#iC,X*)V-
  1873. @P`!0!"&(CA0dB@ad9Q&XG@8ZFR0bB`#3$S6q!*!4KJ!!"a`!N!-@rj!%FR0bBe*
  1874. 6483"!+e@A@qY9QRa!!!(2!#3"J69!*!%6aB!N!KBZ50%$L)UHC1S'*8%bA9TT+@
  1875. j1p$@dHa[k5!+VFfpeIC+dH469DUSme&Cp8TZQ**LVT@8,2ITKKjcNT0%RaYT#6U
  1876. 1BMBmm06j[Vhf`jU0U*C99AqkE1hMZ80*ecRIlPjhaY4%qBTPMVQK6aBYl6%cM[Y
  1877. A*KDYZTGU%V0RVDDDHSqrU@VZAj4h0kfJd#H,Akm[UCr!0Y4Xb&"9p8YY$Gmj%ci
  1878. +cUK9U+ERCUJ'@DT"rkS+ZCm2V5@UVkK9UDcjVD,lDhHK1cqVM9c0EcR[3DqZ9A1
  1879. (3ZIiEJePGh3fYiH3!"`UiP4%qDJL3r88HTKk6feLR[9Gb@$&cQ5rT#5U@"q9eF"
  1880. 6b'kr5P8pmpVrKLUf8-r%ceq6'-I!%qiPPm8-$(H`NZk,l[p)qSI,YrcN6$#8k(1
  1881. TUZ1ebIYc"d2RX!hKVY!"fc-4NkKQRVAlJp3fh,Drab8Q+I@Yh&ZV+1PLC6e19P@
  1882. ,*'D@R(VCU4fe%9B"&b6hCZLF8&Bi%([E`ECA+LF[aMa(q+JFFkdrkmS9brEHQR&
  1883. -4CEmHS%qp-N-@@JQQhVrVBRbj9YbKfKm$cNZUVM)5KJBTm-@SiD90,q@qf90fmF
  1884. r@E2V$+TBqC-c%e893A)QTPL*SNE1UT8@KaR66@,,K"23EV+e-jZ5TfBQLRRLaTe
  1885. "Q#EemT@@NZml5S+D1pMqUTLq)8fjArE82R*0SQC@#lR@A&PI)VM4YH4U%h1lXqK
  1886. ECdbeAC!!*c&T8EPIGYqAqkA3f,ilrIKJa9PAe[X`C6Z,SR-hj0i82+(UPH%$1qk
  1887. r,rGQZVE@PhXc%hjZQ,RZR(*U'r-NbTB21KRF,"C+)D[KThQ2VkGNN!"1&FTq)Sf
  1888. hKQGH9&BKR!*bHeP9pdH1T!*1G@G-aBcN*)llZl6#cjLkDQ@b)[+496Z5al(9HkE
  1889. f9!(4L@dLA#UdePYT`P3hjCi6Zf(mckPFE!IESECA5X8mUd-21lCL'rM#RD*KQE2
  1890. S%hqlI!09)2mp4kDFeBp-14XIQh,8@PGaiFL86l!B+dCQX0@H`54+PLa["EF#ZE5
  1891. +D9a-bjEpj-bHlSH[5E6ec+Kp41JK9bKpCAK@TUb+A!8dT#2F8A-rTN69[90`3US
  1892. LfamB9Tm8@0lZ$081cfV#IXcS'BHCP65HfTfq5rM0HUhUaGa2lBdXE@)LEK2FaV#
  1893. *PqDc9p@A0#ac1DcdM6ej4T8$Gm$13iF&*qXefLmfSfZrYMXCFG3*qcXRV1ANdEp
  1894. h3LHY`TidTNbJ@r-SHFZD0$j$2611c#0j5D$IqYXmHP#Si*DA0[CjF@qN[[AELqD
  1895. fjAlCr0DK"A9P0iXpTV6hdNbL(@$2ZJTlq1@[3U1C)FHmi9H'pBN(YYmpTED0953
  1896. UcPMXC'+Ra*6fR)f*1SrpTGcMXcI2a6hB@+fli@RrTGKLVDb*A@E0B8AZ6A+KDk8
  1897. b*%ph!'c-CQ58IXC8l'LpF#4dB&2a`Pp-UA@hR"#jK@aJ'rC-m`e[G2U[$hfpCX2
  1898. iU3e69cQ5VVYEHjbhYrTfKEiZCN9B4V6heVYEkmX%X[k6YlIqb3[*+Z5R%hI5aNm
  1899. ZEl*[)NM!D-hBPqdCqd!h!,T'k1VZ&,VqeJ9@ReIh&qT(XGqb$lacpc)6rkEUK-m
  1900. !-G%mSX#D5"5BPSD**ZE[eZl,pbS!N!30&NGPFh4KE(4@B@aeC5jbFh*M,QeKDf8
  1901. !N!N,p3#3%!(A!!!)R3#3!aErN!4849K869"6)!%!Ul&M-+e@I``!N!B#63#3"J%
  1902. 4!!!bB`#3"[#58E8!!#Crd+FPlr6Fpi@a1iJlZS1F,aQ&N5Fjbah`#AP-eidbI6J
  1903. Ap+#eaCq1h#JlKb(L*Z53!-FAcXN[,1lc*K*K)*mEql`j#$-lj(9Rbi$*Piii)J,
  1904. +KM+3!+V40!5TME@U&'e+!q#`#SA#@NN*9fQL3j!!aB8a52H"S$m8m(P"KKq&F8f
  1905. K[99ESpk9"TU"bF+NT089)2JQU%1KF&AM-(AUKKN!'"#6R!U6,%3Hj"MN)%XHi%`
  1906. c'R)%5`J$IBFd9l08T4V)NAZec$hN#eZJKh5RN8XEqB,3lFeP$i"9ClB"H6Kc09B
  1907. 3mJE`#NP*SJ'jir"pi8%LF`Ml8)EE3hU90Y&ULFZqmf&mYr&R5eD!RY6k2,N%!!d
  1908. 54f9cG'&XG&CKE(9P4faeC5jME@&VC3#3#DHm!*!3"a`!!!V'!*!$&[q3"&4&@&4
  1909. 08&-J!3#VX@-`V9Cr$!#3"J0Y!*!'!EN!!))m!*!'@%C4#UP3+NeU(H4m!%2JF3H
  1910. $S,8[M0e"h0(0Kr`3F!-2p2S!mS8KKc`qN!#"B"B*Y4eki'ECS0rMaRiB)KTNdXX
  1911. 'EIeC`-*KaSGLQ30rd+G05PVU4F+k*jEr'Z4!PMZEZ0S3X4#j-5QMl`q$X$Z,$IT
  1912. bpId3kHH#0,#3!1BJkXF-j$#[J38Pb1rKFaVK4e`Q3elGC4CpGaLNqh`K`#)BmAY
  1913. pAL$5T3&cQJLi3ekHPSS-LCZIlJrkF6E)J!MiF4K!eNHU36XJe9458ZVNe-'6K9+
  1914. &8&L,P"G`a2!09cEV#bFccCG%@[jq2Uq9q&r'#UX'd4F*KEQ$2'9)4i%r&#!08F@
  1915. ASp3Khkp,0S2VM%RlIXJ(-RfN)Sm,jI32,#4lF9'BGm(G%#d&FAl5Pa1RjSFFS50
  1916. PN!#l-q)Y''eH4mMJa%BHc#%IU9ddeH@(kT'&3aBAaQ4F@@fj#'U%AVNl#%P,eem
  1917. 5(i9a6Air3hHBI(Z8#24lNrKDeGAf))dGLX)"`L5&&+6j-1$B(%8hK&&fEZR)+3Z
  1918. 6BUK5FjX[ZUcXHf"&SVB%e['a3EI(Y`,i,,@!0Ra"(el*I"UU#3F*p`-!N!30%NG
  1919. PFh4KE(4@B@aeC8GXG@8ZD'eKDf8!N!PXYJ#3%!LG!!!1d`#3!aErN!4849K869"
  1920. 6)!%!Ul&M-+e@I``!N!B-eJ#3"J1G!!![Y!#3"KE)#dlaj2%%'F#%(Z'%i5qbNT@
  1921. GNHH%%8ijjH4@[SCRNT8I05AikrJ4IS56S`5!iJpi$5pC25m#m0(M+am3p#-@Z+l
  1922. Ne'24DifXj8@14KKj4LDF(#FSi%Gq*Fc((p"E!Ma[ZDf@Fj4A#%C#`[)FMP!EPTX
  1923. IQ"9a!3`5Q5)Se,*5#F*%bB*%BGJ$9TBj6jMK8P!-Qq4X"Yra!SiVNk'DDelc(,p
  1924. bPV&XhNifPrmN+bMBM+)Q8T95-8-X-Uj"Xk,-X8R2"H'C%B"PCJfAh'5b-MB'm6'
  1925. +*eEA*RpCR@IdLDX8'G0`KLLJ92+#TjM#6MH'IV`$6+6@E4kNT'cmM1IFc'!L&A#
  1926. M3CC)D#JG%*Up&bqqU((SMYYklVUl"#q[+1(ASeQ*ZT0pFbdCm&ma(9$q0l*K2$B
  1927. mVlhq8ZdXDp,*GPbhDHL)5+k+ZDLMSF!e[[jK"mK')a590X6j#Mr*Y@d%+ERYU@0
  1928. eUja+Uk46X#Q9QlTD)d94&Hl[VM0G'N@S,9rR!*lea[(S@IZY[RrSN!"mlq8Vpmp
  1929. pGdP[8SQkR2@4iH+F'LNZ8$3pYL@lS3++QXd&YFRbX*K6R$JPda3!KR'J&(LY%la
  1930. FHSC+*U&4[MH-,5M3Q'0LT'T$,LQb`-[DaYprPbI#-QF*rT0*0Bi&SIb3!1f3!)c
  1931. 0TfL8J8l#")k#Nb$UM[SR4lhAJkYB-"Em!T9QqG`HeL8BKq'#`e[$HmT2TKYmYHF
  1932. ZjKSAcTY1IU6d@,e2["lDp341T(ab9lDVqeH9j4TFAd`N(-!dV"XH'jC-[f8D8pG
  1933. ai!q)JRKm2$U0qcm(R[dil3d2!drche"1U1Td$AcIEkcL8EIhr@Nd(&2Zi$6X4Ye
  1934. "-!SLEkm0DfGl*$jD[eaEfdY&aR5[LHGpQlCm-0edI1X$8PT!Zh5DD-0!MdE2qSj
  1935. iP8B906ZRIEdX&N2&FAiK!YCpGBmplqBmqmXSIKXHleBE[-A1S(q,U2i+e[f4H!I
  1936. XGJAp"qlpJISEhQhX0a!h9f($m(pLMqGR#BcJe%0T@m"4m&SV$Vkh6D(@6p'h%C6
  1937. bI9lEUEX0&`jr$++`jqk@LTdAM*j[QTF'P[0cF9#`j-YAdi9emdS4Cdc4Na!p)e@
  1938. *J44eSZJ4L#Eqq1LBRbQQCN")kDZ8p"c92%[-c9BdDlAGMT[&kpcSpPhRFH$H5FR
  1939. `BG1ZPIYfL&c0j!GJDmRY+m46UHK*#XfL8pF$HX#i#'ac2QbbIhI@'Q&V[VSq!`d
  1940. 0'&"33b"(CA0dB@ad9Q&XG@8J8Q9KC#"0C3#3"fq*!*!3#XB!!",a!*!$&[q3"&4
  1941. &@&4dG(Kd!3#VX@-`V9CP"J!!!V3!!!B9!!!"33!!!QecjSEH!*!'kLd4!!J!20X
  1942. kR#(89VQEYB6m26[h"I3D6SI#85KB-"p!QC6#dELDN!!mS83Jd"UhTCQ5T-[Z*$f
  1943. ,iUk8K,'I%Jpi)*5NFAe)bL(5kE8%@MUGaYp[Rjj5#b!(FeVI9E1kdp$4!YUP3iR
  1944. N#Beadc+TKGYG960RmS3CSfE[d"f&QY"Z'*,YQ1U82+(TNe'Sd9)pffe2V62F(Kh
  1945. L01K@EcVic4E9SB66bTFmS8PTTde&YcfeJhA,cpGQ"JPelPmi'U0hI"PRpf1lli)
  1946. LCTMT8"KLR0@Nf91G"38K(m3i#MX"mj%,CR[LMccb33kA)p[$qSakXMl)iBGpd)I
  1947. Iqi-FardIj$JHrM$REcl-qIi(1FkG2XKa([9KcT%2FhlV`jcIr6$RZ3pb"2M`IT*
  1948. r)(,,Fce,RZ-S&'S$C-UKkBiQ`LLP60E$cjHb#U*J*FJ!*U19(EQ9iFQa)mm)*80
  1949. 'eLi**B``FLXjCNqQ`#Y!PM)"mL)!*jj+9NE3MekJLKkHTXImcZX))bKJj"Pj6T!
  1950. !`Ehe!25mm+Ff#h[ja(k`a+'Q9GcDY&V5QllhcV#i'2*XYSpa1Fb&q*+Gjl9(E#D
  1951. QJ+K,1m9lYdkFGK@GYcEC*LDlQ'lj@cAUKLaNBK!A8%dL$4Pr@dZ[MplY@b#N4[G
  1952. !Yba1m9ZC%GaUHAZT9pl(E5jPY&4XbT1dbGTp#@U'B%BD6BVG%kGYFL)f+)"P0CZ
  1953. GMk$qUl'Jl,VHlbE+RJ89$MeDbl90e$K[%DKXZAlNLd[YJ+03[f!I`j8NbHBi*(0
  1954. [5j9b-ZVB$ZI8TrM&'P'B+2&@faj%,h+e90['"6YkG)eB`bA+VPG#+3k`eb)SQq4
  1955. kL3P("[DjX+'16BTiVeQB5Q$K9TkcT-()!&cU3re2EP$l%A@0#YA3(G-dmAV@X3[
  1956. 2DGXkdf,!X#cK!Sfh6YUlY9NFR)RMqNa0NJ8aGAa5)ESJ0N'3!+L6Fh$jbSfXE(P
  1957. rHK)Nl9DDR@p%q)ke#&YeI)(eC(UrqJbG,X!#VX+`f28Ul@pR&$&kb`Mj`(6%m@F
  1958. iG#[K+XfA(cqFcaGdGN`[Aaf9@[d!B'J&F((F"%"iQ*Q+cKVG'3S@RM(9VQR`*4$
  1959. NTQ4T'020`GRa3L2RN!#ST++JD6PX,+hM(F,*M!,PBECJdX0Lk[ED$K$'0AXdYD)
  1960. 6aNEm[0AKd&e60#eZ0Lh!PS($IZRBmIdUU'KDe38RMVhlLZb0MfXql-66'*6KqCZ
  1961. QF'jEMQSQI&b)kq!Cm&ep!IdDU'ZfeHar!*!%$4&38%0(CA0dB@ad9Q&XG@8ZBe*
  1962. PB@3J6@8!N!IChJ#3%!l6!!!A)J#3!aErN!4849K869"6)!%!Ul&M-+e@I``!N!B
  1963. *`!#3"J2"!!"e,`#3"Ukk#dlaj2%%'F$-)kaENkam2AEN1H(NQ0c)88,2j#ZrG8,
  1964. @Cj(MC!D`HX"V!K!'X!*F"1#MaeGq(N%rBS%!VUjVIACV4cLK9q5iC-`*@KMKH)*
  1965. rS)&&@[@dANmkUQ6bKM+K&(ABHD(mEb+)T#C"QFQC,$Y6fSaTEXd5SY(SR%44+*N
  1966. *,ie'M*!!C,DLAq55HU9IX&eV,UAL9dN#`ffdRTaCB9I0E1hbZbPT+9C)R"PE'#X
  1967. m+PP)4diX#m99#9+MT49kf%ChG#2p`T3qa%"0hXSXk"V`0qA9!Tqm5l%3MQE-QJT
  1968. VVQA114fG6DJl15+Kmq#f$P)JQja**If+jXD5p)j-`DJ'k3M9[(caiRQX`cA6HLY
  1969. 0Me'H+T(`aci[$FTGr24"-ei6j2Db[[b$mcjk#E+d!R,!0eY@'M6Q3SQ-pk,3eJ8
  1970. VpMYGm"H@D9C+j5YL*L[RH8Nr0,p[31C*'dpSN!#&9C)YZ5Kh6CS#P%M)M*@j#8'
  1971. Ndprk6C6j1XL%VePIbQXHfKi`"4L1FTj,cARNi"K1cakYhVfM6R[3(Tp0Zi21q@A
  1972. r!c4(faE$*$8A4fN+LCGCXY@1$&TebG9@dpEHVLVKkFEcC`#L1-'cXkTNp*S'EhU
  1973. p8fV9!BRd%YZh)XFq$'&38L#k`V&R40b&r6EZCh%p(GL&+ScmNqQTS8M*ZU6KT'e
  1974. Y6,JeUedEQCqNIk9V2@+@32!ed-A[dc4*%r6@R6qf8Q'V%)Vc4[c'H-(lTKPD6F"
  1975. RE9r1KSN+#MT*%d4ra+E$rZ9QbfT[YaC369F&PZQ6URYaJXlqbIhX,RF-MR,$&p$
  1976. VpNI$mI4X-+A"F0Tq&5F+pMVr6LLM2d%BPMhXGq8p'VGl`l1,L'C[H2jV'lmmVJ0
  1977. -)11Z!1V18*Gb8m'5[3f3!1"Zi@B-!&!5F"E+S!R-bL,5aS&M+L,)U-+@Q5maYjA
  1978. G19ENMFEH@5I8b*UX9Y[p(RPl8RmJS"(-`d1)@I5&e09F`,+VjkC"hcaY536V2Gk
  1979. XA#JqiR-l&f!2Hf&XE@1$Pf88TN(LfJA5pjZP'`)TLe-+@aj2(KECBV2Yi4MFPY"
  1980. F"-GfF0KBKJ-b%KMZ-fX++m-CYpZRHDRMG9CG6)9`m+3iF[6akU(DF",Q"+3UcVb
  1981. aBFRd&@QqLIV$2-CC[+hq-+N"JEK!'i[eQQl@lYBj32baLiMbjcNrR'YhMGf@KI#
  1982. IfGY4m($U2C&J+kXP*ZPV#%3mp2+&LVp[eVX'$qAp4mMpcAX!j#X(*0cRr`,#[Gm
  1983. G"rqfIX`kPr1NeASkTp2r!3#3"!d98&"$4f9cG'&XG&CKE(9P9'9cG#jM)%eP!*!
  1984. (aqX!N"!5m3!!'%F!N!-@rj!%9%9B9%0A588"!+e@CbqY9Rm3!*!'!H8!N!He!!!
  1985. 1mJ#3"[df8EAm)8q3!22k3&0A0ZX,*c20KBP)SE8[M0e"h0%Gj(c*M%JSM%#r&f5
  1986. jr5%aIbN+"`L6l'P'K*+3!#r-"A%6BC)`bH",jc,6-"+,ZV00BJC3VkfPVD@H50)
  1987. N55%&D3cNJPl!Z#-q%)+BmBFb!H0$2L"9m!,5"CS"QbqkY!%e9d)$+Ie5PDS'$4X
  1988. e9NYq0FlB,j3l2MESp[JfD1mdEY5`J8UCqTYfaRkKhI!&IALYpEpMHM1TUA!r$3d
  1989. 98&"$4f9cG'&XG&CKE(9P9'9cG#ke)%eP!*!(M&d!N"!A)J!!)lN!N!-@rj!%68e
  1990. 38N0A588"!+aHCb'Y9Rl%!!!RcJ!!"q3!!!IT!!!$'IUi-+-!N!B(q!h!VCPGDfi
  1991. kU*A6c-e5bqZLRGIDFFU2F-,)bLNrLUFRTjHFFQSRTd2qY&r$8cclY9Df2XGh4@J
  1992. pqE8)Rj!!iq3iM6`Ma`QlhL5FF(*m3&MR%6iKr1h)FF)**mFT1Ak%%dDH05(FMV#
  1993. 1--)bFLc+Mc$#AmPcE`AZbUj*Pfm[TkeX2Ik%d`L,(2F)Lm`iiB4621(!H!m)3+q
  1994. c``-3!*KG!C!!MDIU(UIrZf[[*1$r`3hc1AmrRMqfp13ErIZN@r@P9UYjSH$afKc
  1995. H4TZM8kK(c2LL#P4JX9KVc8hbrBBb*)'"j!D$a0GYAV3X%b"Z0m$Plf89'relRYT
  1996. 3@EC8dp$ce"C6"L,T&8lrTR`M*11T`c1qqY@$QTT[)(Q*VU'([R9VRUkYVbQ)VHU
  1997. EdHph9bqUlL`!L'AdBYQR(Z!l`Kp!(BX"eBd!&9q5Y$Ri3X@5Car0G5`dS-*%-BL
  1998. XaG[[1FG$K5bd#J!Xj+LNLL4EE,bKTXk!T@S`jjYcFid[$QIK@#%%,S&l!eP,TUM
  1999. Z'-UM4cC0C"[*L,Q'm[VdGDcI$r'G%@*TGFYTr(j#Jd)cT5Z0pHX"L[hd#qJb4@0
  2000. a1@fmDe`r0H5!PVbTmJA[KaX)RTF835c91#"aPGfj3K#2-)PQ5#Za@UXQ#fi*RL9
  2001. ZYd-CJ)I&8P8DbC0BC@mch,$5l4+p90VM15c@UR+&!"j0jZZ9!A5YVDXG*ALH4he
  2002. CFlh+b*r1Sl-d56h[P+S5$l@4cme9"1!4Bq42#r)($lGLJ+lZF5,RH!KGT`Aj0D4
  2003. kAIj2[5B(HB69q"rbX0Sm[-da*UbNUp[Q83VJ`BmV'p'9'K[+3d0jr0b*c[*3'Br
  2004. iQk')U49ZMp4VXlNQkKZ5DC,bX(0SGr'GrlB1eZp&MaKZpK-m2-XGEC%mLGDb-kS
  2005. L$fqR3J!2'QSM9XRIZPTT,8S1pqS&0bUA1&b8pRL1#`lh&!r&!)GE8eTTL1TKX6C
  2006. &p&"UF-SReEMJP--mcMRP+)m*Tac9GF)T4hJS,cMP86hqFXURK$h[P#-m*Tcb+)f
  2007. ,6MR-3aR!+5Yr10b6"A["iBje4X8!KpYNGejCD1KDF28*Kk[pdqNJN4-jrR3kB4l
  2008. R(%T8M`Q(%Z&aYJ12mVMBJF-mBScKVKH22,$`SeCiXX1%H$MXife[F*)`9QQ8KkZ
  2009. YBja(69Y(K-F8bmPeK@"a@-biUD-%%,pecRK8JeAd'4lBU4cMAM'&mR$B2"k$fEA
  2010. 5EAFF9PIZ$&M4`P*&!&dR1d2)5iFpq9NHN3iFUE03jr51PpP%D!aXkBIJ&Sm@#$&
  2011. "#q+YKcC#blbp%JE`"N!,jr[N%*jpR)rcIIV4l&EFq%Q#(CKj$Gi"0kL!9((GMl`
  2012. ,,I-VS2@(*H$lE$[ilZlLI"Zdl)h[,Qb(P)R%cj!!c(A6I&ch`jr"V4rI0m`&%Gq
  2013. p6`i),Yea6``$mb1rJH#kYmlNZVIJk`!rQ,S)GZ!ja1IZhG"5[![[,c%Z[BccIPM
  2014. 2P*k+@C%af3QUZ5CTP&VAkDEGf93Kf0S&d@0UF0TAi4e((2),lYjYKdM4Y3@%Rhi
  2015. 9iG2fNU+Cfh&4kLT+Q2#TbD83V`0GPMiSP,jNCk3HLHQ,PaR!"hK3A#Aa)8AAlBS
  2016. @p"l`3$rdNU++MfJP%(iD1J3pkT-Uf8IGV2XJjF%RXb&HcI4iM#aNTa4TN!#*@e@
  2017. Up*%D3&3@ACrB#bQ2ji3%bj1U%V15MUm,30q`#mmGbrd(1-6RiMXrk#r03k`Icf5
  2018. BfPf2qGr)"V8DFF0!IN$F+Z&jAT,lcLB2,pTK'JjP-6rE,1[S`ek!qV$mmCKrhhE
  2019. 3TiAf`V,fVq(@[H"&""X"jG2h,1Jc0T2VG9E%2N"qDeQ[5hRm6LNrkN(ckc0PDih
  2020. kdhdq@J264fS!MCpS%qf#a`5+$cA!V4ZV!E,LmpH8"'VJ#P119A4e#,cA81HeHHd
  2021. ZTb#ZRQ[kk8f`5T4)qN$55"qJZiiFFU+FP9&k)BUTaDhBK$Vl5VG$-*3+`Z5%@l%
  2022. M#"!PQ#,!d)0DAZ`G@RP1K$JX%AB%AVk&'p+rE##IL@)-DAH*q*U2l!"I$-SR#"l
  2023. EG%DH)bN,8FH!e#%R("d(DDP[$h,k31UP``eJ@,mEr$iM8jLJi"2k@i(a"kdB
  2024. bk5&'*EA0iF$qbFbEiNH&%(hJP`c+-r%URG"GF[3['S0*"[e2`*[J2aZDIjN%+J#
  2025. 8lB"61ZU6L&SaaX"),Nplq&FMSIqSN!$RPhdl[4QIc#"18,NEfFC$ZP[%pBCT-+H
  2026. Z[MB,-`lYX-lEbYB&d$hMlc,@33CHM436"+"V!3YBArJ+k0V)Za6,f`5i5d[5+9E
  2027. b+0b%@#(&CRd2b*Zd8``*iLbI2%HaaPX!hqMh8qb@pq%fJ2qR8Zc+qk%,i,*XLU8
  2028. @`Pf)&9%XrJRS3DbDBSkGm"$qh)2Pbmf%Ta&MHm@9VI!+BMG6,'iMR6SCf!5l*4p
  2029. `+QjJUaaY-`$lPQ%9a9BIK(f)2F"i2!-(!$,CU(jq$Nl*B*D6BU9[N`3FCH(%#k1
  2030. A6YkbkB34BVjP'11A*%mMXDim1)e-C1Y#`H@5",S`CRDe#`X&TcDd2-DH"6)RbJc
  2031. +ZVbLcD-TDlGlAD+kh1AdDZTYiM,"Ub[KH3%h9U`flh*mcp)Nd&eVQ9KSljSpNiP
  2032. *'e#b&!'ib5BklFjP(Sfjh),*NJ+,Nh)@'CI6*,$"5B"Rk!mQF46#p6[f2-"AKqZ
  2033. +34lr!3!!#X"&"hlQ-@85GQ4##5-d-U,N+,Q98$*KK"&'MK%U)bYK+cX*95DH8#p
  2034. lFS```[$8NlC+$Nq9%Ia(k)#``8TQM%`CBB3G'E!M-dBBBB5YNJNPamL!N3Pl-Q#
  2035. %N4%l`JJlFT3-Q16B%fD%N3RYb6%bSJ,h5DpENa`MafiY`Xl%%dD1%43aB!,JK99
  2036. HHG-d!)$Jf`-3Q-2h#Xi8I&[aIB6G!%M3&mLBC5Z[f8#H2i0,-&QXI8j!%!Qd3Pk
  2037. 2*8QF&j(9I'pDRl*85dGUNI(D28KJJiFeJ'pIp-L*c0!'m"$MYAN%`48me0HGFG4
  2038. 536A-NYCli1"`Ep)XD$!1pmM5jC8kE4&h-LJP,YEJ#9NP(kA$dL$1RY)*pLr*Bl+
  2039. %rBShIrH&m4jDN!#pM0ZYS)iJm`J[0SNT5[+BCMZUiH48Skc&mhAG'b@fhHAQcZp
  2040. &GUbk[r)!qk$AGhKpTpH([$jFe6pp`2i8R'CZE1MIdp#IaGRh(83EqS@Zb+f(Yk2
  2041. BTq"ibe[XT8epR8-P4l1QeEb'VQbZPK@kK&964d"@RH+1"&BdEhlTL-VMbG&bbG&
  2042. RY2Lf(*%D3SIBMkHMLb90XVmrMJEkV86iVDQ$*eE59i%4mNG(*$-d-MEa9mCk#JS
  2043. G`LmLMqTKC0R@9KlYqVVM"+TiCIZHF#2T19+4PA5+6N$L90m"EQ4i39#(&k#&8CI
  2044. mA+Q1h%b3!)TG0+ES"&SCpBfI)RHZ6e+U8jkL%fLMe0F,IQDiXI4ZEd-iJAC'[H%
  2045. ldJhhA21S1-&mPi!%ArMh!+E['UPNMdjNhGb&Fa"-B#iXh`r+fSaTcFH,cEfb@i"
  2046. 4f56%UH&4cHEhf!p`JpVK8@9p6L[)H#RpSiBj0C!!R6qlTC04k6A"UA65bDQKNFb
  2047. BSaXrZ3fY%HkKD0e!hp$dBZ%HBVG,P&2p5mM0QE2#HHBXjKrhkdjHZMPpP96S2cU
  2048. ",VlAlU4C+ZL1ETC8!dpFbfaXQ0eB`Z9h)HCj++8EfalDG!12CVc(39)bfTPDE4f
  2049. %I`M32c6cbH,d"(Elk*@UT'f(84HR6q**YSE[959Pf262Ib%K%&"33b"(CA0dB@a
  2050. d9Q&XG@8!N"3j!"-"D`)A!*!$!3!!'%F!N!F@!*!$KJ!!!`$rN!3"!+e@EkkY9Rm
  2051. F!*!'B!#3"b-c!*!+19M6B3!!:
  2052.  
  2053. ---------------------------
  2054.  
  2055. End of C.S.M.P. Digest
  2056. **********************
  2057.  
  2058.  
  2059.  
  2060.